Sabia que uma função STRING_SPLIT nativa incorporada no SQL Server foi adicionada ao SQL Server 2016? Como consultor, vejo tanto código que chamam a uma função escalar que são usados para dividir variáveis delimitadas por strings numa lista utilizável. Para aqueles que utilizam este método, sugiro que olhem para esta função. STRING_SPLIT é uma função de valor de tabela que retorna uma única coluna dos valores da sua string dividida pelo delimitador. Este é um bit incomum de T-SQL, na medida em que o nível de compatibilidade 130 ou superior é necessário para a sua utilização (a Microsoft não quis induzir alterações de quebra no código de utilizador existente). A utilização deste método é muito mais eficiente e pode ser executada sem chamar uma função escalar.
A sintaxe
STRING_SPLIT ( string , separador)
Como utilizá-lo
SELECT value AS 'Flavor' FROM STRING_SPLIT('Chocolate,Vanilla,Strawberry', ',');
Resultados
O Plano
Aqui está o aspecto do plano. É muito simples e directo.
Função Personalizada
p>Agora é uma versão caseira que se pode encontrar em alguns ambientes. Pode ver a sua muito menos eficiente.
/****** Object: UserDefinedFunction . Script Date: 2/11/2020 6:26:45 PM ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER FUNCTION .( @sInputList VARCHAR(8000) -- List of delimited items , @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items) RETURNS @List TABLE (item VARCHAR(8000))BEGINDECLARE @sItem VARCHAR(8000)WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0 BEGIN SELECT @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))), @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList)))) IF LEN(@sItem) > 0 INSERT INTO @List SELECT @sItem ENDIF LEN(@sInputList) > 0 INSERT INTO @List SELECT @sInputList -- Put the last item inRETURNEND
Os Resultados
Resultados são os mesmos. Mas note que o nome do seu campo será sempre o mesmo, com a nova função obtém-se um pouco mais de flexibilidade nisto.
O Plano
É um pouco mais complicado do que o directo que vimos acima, incluindo uma sequência.
Há muitas maneiras diferentes de escrever uma função dividida para fazer as coisas funcionarem, contudo, agora que o SQL Server nos deu uma, encorajo-vos vivamente a darem uma vista de olhos. Ao afinar o desempenho, não se esqueça de dar uma vista de olhos ao que sempre fez no seu código e procure formas de o melhorar, como esta. Pode saber mais e ver mais exemplos aqui em docs.microsoft.com.
Contacte o Autor | Contacte o DCAC