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
SELECTdeclaraçã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 TEXTSIZEpermite 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 TEXTSIZEsó funciona em varchar(max) , nvarchar(max) , varbinary(max) , texto , ntext e imagem dados. Observe omaxpapel. Se você usar um tamanho de dados fixo (comovarchar(255)por exemplo),SET TEXTSIZEnã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 TEXTSIZEpor 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.