sql >> Base de Datos >  >> RDS >> Sqlserver

LEFT() vs SET TEXTSIZE en SQL Server:¿Cuál es la diferencia?

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.