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 é queSET TEXTSIZE
só funciona em varchar(max) , nvarchar(max) , varbinary(max) , texto , ntext e imagem dados. Observe omax
papel. Se você usar um tamanho de dados fixo (comovarchar(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 porLEFT()
mas nãoSET TEXTSIZE
.
LEFT() é mais específico
Outra diferença é queLEFT()
é 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.