Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

LEFT() vs SET TEXTSIZE no SQL Server:Qual é a diferença?


Você pode estar familiarizado com o SET TEXTSIZE instrução no SQL Server, que permite limitar a quantidade de dados retornados em um SELECT inquerir.

Talvez você esteja descobrindo que seus resultados são exatamente os mesmos que LEFT() ao executar uma consulta específica. O que levanta a questão:existe uma diferença entre essas duas opções?



Há definitivamente diferenças entre essas duas opções. Há casos em que ambas as funções retornarão resultados completamente diferentes. E também há diferenças em como eles funcionam, bem como no tipo de dados em que podem ser usados.

Definições


Vamos começar analisando o que cada um faz.
LEFT()
Retorna a parte esquerda de uma string de caracteres com o número especificado de caracteres.
SET TEXTSIZE
Especifica o tamanho de varchar(max) , nvarchar(max) , varbinary(max) , texto , ntext e imagem dados retornados por um SELECT declaração.

Vamos examinar isso em detalhes.

Caracteres vs Tamanho dos Dados


Preste atenção ao texto de cada definição. Em particular, as palavras “caracteres” versus “tamanho” e “dados”.
  • LEFT() permite indicar explicitamente quantos caracteres são retornados.
  • SET TEXTSIZE permite que você especifique o tamanho dos dados retornados.

Essa é uma distinção importante a ser feita, porque você obterá resultados diferentes dependendo do tipo de dados. Caracteres diferentes podem exigir tamanhos de armazenamento diferentes. Um caractere pode usar 1 byte e outro pode usar 2 bytes.

Usando LEFT() permitirá que você especifique o número de caracteres, independentemente de quantos bytes eles usam.

SET TEXTSIZE por outro lado, permite especificar o número de bytes retornar – não os caracteres numéricos.

Se os dados forem armazenados usando nvarchar(max) por exemplo, você pode descobrir que SET TEXTSIZE retorna metade do número de caracteres que LEFT() faz.

Exemplo:
CREATE TABLE TextSizeTest ( varchar50 varchar(50), varcharMax varchar(max), nvarcharMax nvarchar(max) ); INSERT INTO TextSizeTestVALUES ( 'Dragonfruit', 'Dragonfruit', 'Dragonfruit' );SET TEXTSIZE 50;SELECT LEFT(varchar50, 4) AS varchar50, LEFT(varcharMax, 4) AS varcharMax, LEFT(nvarcharMax, 4) AS nvarcharMaxFROM TextSizeTest; SET TEXTSIZE 4;SELECT * FROM TextSizeTest;

Resultado:
+-------------+--------------+---------------+| varchar50 | varcharMax | nvarcharMax ||-------------+-------------+---------------|| Arraste | Arraste | Arrastar |+-------------+--------------+---------------+(1 linha afetada) Comandos concluídos com sucesso.+-------------+--------------+------------- --+| varchar50 | varcharMax | nvarcharMax ||-------------+-------------+---------------|| Dragonfruit | Arraste | Dr |+-------------+--------------+---------------+(1 linha afetada)

O primeiro resultado é para LEFT() . Funciona em todos os três tipos e tamanhos de dados. Ele retorna o número exato de caracteres especificado.

O segundo resultado é para SET TEXTSIZE . Não afeta o varchar(50) resultados. Afeta apenas os outros dois. Mas isso os afeta de maneira diferente. Para varchar(max) , cada caractere usa 1 byte e, portanto, obtemos o mesmo número de caracteres retornados que o TEXTSIZE especificado . Para nvarchar(max) é uma história diferente. Cada caractere usa 2 bytes e, portanto, obtemos apenas metade do número de caracteres retornados.

No entanto, os resultados retornados por LEFT() ainda pode ser afetado por SET TEXTSIZE . Se eu executar o LEFT() consulta novamente, mas preceda com SET TEXTSIZE 2 , obtemos isso:
SET TEXTSIZE 2;SELECT LEFT(varchar50, 4) AS varchar50, LEFT(varcharMax, 4) AS varcharMax, LEFT(nvarcharMax, 4) AS nvarcharMaxFROM TextSizeTest;

Resultado:
+-------------+--------------+---------------+| varchar50 | varcharMax | nvarcharMax ||-------------+-------------+---------------|| Arraste | Dr. | D |+-------------+--------------+---------------+ 

Tamanho máximo de dados vs tamanho fixo de dados


Outra diferença é que SET TEXTSIZE só funciona em varchar(max) , nvarchar(max) , varbinary(max) , texto , ntext e imagem dados. Observe o max papel. Se você usar um tamanho de dados fixo (como varchar(255) por exemplo), SET TEXTSIZE não funcionará.

LEFT() por outro lado, funciona com todos os dados de caracteres, exceto texto e ntext .

Você pode ver essas diferenças no exemplo anterior. O varchar(50) os dados foram afetados por LEFT() mas não SET TEXTSIZE .

LEFT() é mais específico


Outra diferença é que LEFT() é aplicado apenas à coluna (ou constante ou variável) que você especificar. Se você quiser aplicá-lo a várias colunas/expressões, precisará incluí-lo novamente para cada expressão. O mesmo com as consultas subsequentes.

SET TEXTSIZE por outro lado, é aplicado a todas as colunas aplicáveis ​​retornadas na consulta. Também é aplicado a todas as consultas até que seja definido para outro valor.