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

Use SET TEXTSIZE para limitar los datos devueltos para cada fila en SQL Server

En SQL Server, SET TEXTSIZE declaración especifica el tamaño de varchar(max) , nvarchar(máximo) , varbinario(máximo) , texto , ntext y imagen datos devueltos por un SELECT declaración.

Microsoft aconseja que texto , ntext y imagen se eliminará en una versión futura de SQL Server, por lo que debe evitar usar estos tipos de datos en nuevos trabajos de desarrollo y planear modificar las aplicaciones que actualmente los usan para usar varchar(max) , nvarchar(máximo) , o varbinary(max) en su lugar.

Ejemplo 1:uso básico

Aquí hay un ejemplo de configuración de TEXTSIZE valor.

SET TEXTSIZE 2048;

Eso establece TEXTSIZE a 2048 bytes.

Ejemplo 2:comprobar el valor de TEXTSIZE

Puede verificar el TEXTSIZE actual valor con @@TEXTSIZE :

SELECT @@TEXTSIZE AS [Text Size];

Resultado:

+-------------+
| Text Size   |
|-------------|
| 2048        |
+-------------+

Ejemplo 3:cómo afecta los resultados de la consulta

Aquí hay un ejemplo que demuestra cómo TEXTSIZE El valor puede afectar los resultados devueltos en un SELECT consulta.

Primero, creemos una tabla, insertemos un texto y luego selecciónelo.

USE Test;
CREATE TABLE TextSizeTest (
    varchar50 varchar(50),
    varcharMax varchar(max),
    nvarcharMax nvarchar(max)
    ); 
INSERT INTO TextSizeTest
VALUES (
    'Dragonfruit',
    'Dragonfruit',
    'Dragonfruit'
    );

SELECT * FROM TextSizeTest;

Resultado (normal):

+-------------+--------------+---------------+
| varchar50   | varcharMax   | nvarcharMax   |
|-------------+--------------+---------------|
| Dragonfruit | Dragonfruit  | Dragonfruit   |
+-------------+--------------+---------------+

Esto es lo que normalmente esperaríamos. Devuelve el texto completo dentro de cada columna porque cada fila de texto ocupa menos de 2048 bytes (que es lo que establecí TEXTSIZE en el ejemplo anterior).

Pero esto es lo que sucede si reduzco el TEXTSIZE valor:

SET TEXTSIZE 4;
SELECT * FROM TextSizeTest;

Resultado:

+-------------+--------------+---------------+
| varchar50   | varcharMax   | nvarcharMax   |
|-------------+--------------+---------------|
| Dragonfruit | Drag         | Dr            |
+-------------+--------------+---------------+

La primera columna no se ve afectada porque no es una columna "máxima". Lo que quiero decir es que es un varchar(50) y no varchar(max) . El TEXTSIZE la opción solo afecta a las columnas definidas con max .

La segunda columna devuelve los primeros cuatro caracteres. Esto se debe a que configuramos el TEXTSIZE valor a 4, y los primeros cuatro caracteres usan 4 bytes.

La tercera columna solo devuelve los primeros 2 caracteres. Esto se debe a que es un nvarchar columna. En este caso, los dos primeros caracteres utilizan 4 bytes.

Ejemplo 4:restablecer el valor

Una cosa a tener en cuenta es que especificar SET TEXTSIZE 0 en realidad lo "restablece" al valor predeterminado de 4096.

SET TEXTSIZE 0;
SELECT @@TEXTSIZE AS [@@TEXTSIZE];
SELECT * FROM TextSizeTest;

Resultado:

+--------------+
| @@TEXTSIZE   |
|--------------|
| 4096         |
+--------------+
(1 row affected)
+-------------+--------------+---------------+
| varchar50   | varcharMax   | nvarcharMax   |
|-------------+--------------+---------------|
| Dragonfruit | Dragonfruit  | Dragonfruit   |
+-------------+--------------+---------------+
(1 row affected)