¿Sabías que una función nativa STRING_SPLIT incorporada en SQL Server se añadió en SQL Server 2016? Como consultor veo mucho código que llama a una función escalar que se utiliza para dividir las variables delimitadas por cadenas en una lista utilizable. Para aquellos que usan este método sugiero que miren esta función. STRING_SPLIT es una función con valor de tabla que devuelve una sola columna de sus valores de cadena divididos por el delimitador. Esta es una parte inusual de T-SQL, ya que se requiere el nivel de compatibilidad 130 o superior para su uso (Microsoft no quería inducir cambios de ruptura en el código de usuario existente). El uso de este método es mucho más eficiente y puede ser ejecutado sin llamar a una función escalar.
La Sintaxis
STRING_SPLIT ( string , separador)
Cómo usarlo
SELECT value AS 'Flavor' FROM STRING_SPLIT('Chocolate,Vanilla,Strawberry', ',');
Resultados
Aquí se ve el plan. Es muy sencillo y simple.
Función personalizada
Ahora aquí hay una versión casera que puedes encontrar en algunos entornos. Puedes ver que es mucho 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
Los resultados
Son los mismos. Pero ten en cuenta que tu nombre de campo será el mismo cada vez, con la nueva función tienes un poco más de flexibilidad en esto.
El Plan
Es un poco más complicado entonces el directo que vimos arriba incluyendo una secuencia.
Hay muchas maneras diferentes de escribir una función de división para hacer que las cosas funcionen, sin embargo, ahora que SQL Server nos ha dado una, te animo a echarle un vistazo. Cuando afines el rendimiento asegúrate de echar un vistazo a lo que siempre has hecho en tu código y busca formas de mejorarlo como esta. Puedes aprender más y ver más ejemplos aquí en docs.microsoft.com.
Contacto con el autor | Contacto con DCAC