Puede que estés familiarizado con SET TEXTSIZE
declaración en SQL Server, que le permite limitar la cantidad de datos devueltos en un SELECT
consulta.
Tal vez encuentre que sus resultados son exactamente los mismos que LEFT()
al ejecutar una consulta específica. Lo que plantea la pregunta:¿Hay alguna diferencia entre estas dos opciones?
Definitivamente hay diferencias entre estas dos opciones. Hay casos en los que ambas funciones devolverán resultados completamente diferentes. Y también hay diferencias en cómo funcionan, así como en el tipo de datos en los que se pueden usar.
Definiciones
Comencemos mirando lo que hace cada uno.
LEFT()
- Devuelve la parte izquierda de una cadena de caracteres con el número de caracteres especificado.
SET TEXTSIZE
- Especifica el tamaño de varchar(max) , nvarchar(máximo) , varbinario(máximo) , texto , ntext y imagen datos devueltos por un
SELECT
declaración.
Examinemos esto en detalle.
Caracteres frente a tamaño de datos
Preste atención a la redacción de cada definición. En particular, las palabras "caracteres" frente a "tamaño" y "datos".
LEFT()
le permite indicar explícitamente cuántos caracteres son devueltos.SET TEXTSIZE
le permite especificar el tamaño de los datos devueltos.
Esta es una distinción importante que hacer, porque obtendrá diferentes resultados según el tipo de datos. Diferentes personajes pueden requerir diferentes tamaños de almacenamiento. Un carácter puede usar 1 byte y otro puede usar 2 bytes.
Usando LEFT()
le permitirá especificar el número de caracteres, independientemente de cuántos bytes utilicen.
SET TEXTSIZE
por otro lado, te permite especificar el número de bytes volver – no los caracteres numéricos.
Si los datos se almacenan usando nvarchar(max) por ejemplo, puede encontrar que SET TEXTSIZE
devuelve la mitad del número de caracteres que LEFT()
hace.
Ejemplo:
CREATE TABLE TextSizeTest ( varchar50 varchar(50), varcharMax varchar(max), nvarcharMax nvarchar(max) ); INSERT INTO TextSizeTest VALUES ( 'Dragonfruit', 'Dragonfruit', 'Dragonfruit' ); SET TEXTSIZE 50; SELECT LEFT(varchar50, 4) AS varchar50, LEFT(varcharMax, 4) AS varcharMax, LEFT(nvarcharMax, 4) AS nvarcharMax FROM TextSizeTest; SET TEXTSIZE 4; SELECT * FROM TextSizeTest;
Resultado:
+-------------+--------------+---------------+ | varchar50 | varcharMax | nvarcharMax | |-------------+--------------+---------------| | Drag | Drag | Drag | +-------------+--------------+---------------+ (1 row affected) Commands completed successfully. +-------------+--------------+---------------+ | varchar50 | varcharMax | nvarcharMax | |-------------+--------------+---------------| | Dragonfruit | Drag | Dr | +-------------+--------------+---------------+ (1 row affected)
El primer resultado es para LEFT()
. Funciona en los tres tipos y tamaños de datos. Devuelve el número exacto de caracteres especificado.
El segundo resultado es para SET TEXTSIZE
. No afecta a varchar(50) resultados. Solo afecta a los otros dos. Pero les afecta de manera diferente. Para varchar(máximo) , cada carácter usa 1 byte, por lo que obtenemos la misma cantidad de caracteres que el TEXTSIZE
especificado . Para nvarchar(máximo) es una historia diferente. Cada carácter usa 2 bytes, por lo que solo obtenemos la mitad de la cantidad de caracteres devueltos.
Sin embargo, los resultados devueltos por LEFT()
aún podría verse afectado por SET TEXTSIZE
. Si ejecuto LEFT()
consulta de nuevo, pero precedida de SET TEXTSIZE 2
, obtenemos esto:
SET TEXTSIZE 2; SELECT LEFT(varchar50, 4) AS varchar50, LEFT(varcharMax, 4) AS varcharMax, LEFT(nvarcharMax, 4) AS nvarcharMax FROM TextSizeTest;
Resultado:
+-------------+--------------+---------------+ | varchar50 | varcharMax | nvarcharMax | |-------------+--------------+---------------| | Drag | Dr | D | +-------------+--------------+---------------+
Tamaño máximo de datos frente a tamaño fijo de datos
Otra diferencia es que SET TEXTSIZE
solo funciona en varchar(max) , nvarchar(máximo) , varbinario(máximo) , texto , ntext y imagen datos. Tenga en cuenta el max
parte. Si usa un tamaño de datos fijo (como varchar(255)
por ejemplo), SET TEXTSIZE
no funcionará.
LEFT()
por otro lado, funciona con todos los datos de caracteres excepto texto y ntext .
Puedes ver estas diferencias en el ejemplo anterior. El varchar(50) los datos se vieron afectados por LEFT()
pero no SET TEXTSIZE
.
LEFT() es más específico
Otra diferencia es que LEFT()
solo se aplica a la columna (o constante o variable) que especifique. Si desea aplicarlo a varias columnas/expresiones, debe incluirlo nuevamente para cada expresión. Lo mismo con las consultas posteriores.
SET TEXTSIZE
por otro lado, se aplica a todas las columnas aplicables devueltas en la consulta. También se aplica a todas las consultas hasta que se establece en otro valor.