División de la cadena en el servidor sql

Tengo una cadena en la base de datos que está separada por comas. Como ‘manzana, plátano, piña, uvas’ Necesito dividir esta cadena en base a una coma e iterar a través de esto. Dado que no hay una función incorporada en el servidor sql, hay alguna manera eficiente en que este objective se puede alcanzar.

Prueba esta función

CREATE FUNCTION [dbo].[func_Split] ( @DelimitedString varchar(8000), @Delimiter varchar(100) ) RETURNS @tblArray TABLE ( ElementID int IDENTITY(1,1), -- Array index Element varchar(1000) -- Array element contents ) AS BEGIN -- Local Variable Declarations -- --------------------------- DECLARE @Index smallint, @Start smallint, @DelSize smallint SET @DelSize = LEN(@Delimiter) -- Loop through source string and add elements to destination table array -- ---------------------------------------------------------------------- WHILE LEN(@DelimitedString) > 0 BEGIN SET @Index = CHARINDEX(@Delimiter, @DelimitedString) IF @Index = 0 BEGIN INSERT INTO @tblArray (Element) VALUES (LTRIM(RTRIM(@DelimitedString))) BREAK END ELSE BEGIN INSERT INTO @tblArray (Element) VALUES (LTRIM(RTRIM(SUBSTRING(@DelimitedString, 1,@Index - 1)))) SET @Start = @Index + @DelSize SET @DelimitedString = SUBSTRING(@DelimitedString, @Start , LEN(@DelimitedString) - @Start + 1) END END RETURN END 

Ejemplo de uso : simplemente pase la función de la cadena delimitada por comas, así como su delimitador requerido.

 DECLARE @SQLStr varchar(100) SELECT @SQLStr = 'Mickey Mouse, Goofy, Donald Duck, Pluto, Minnie Mouse' SELECT * FROM dbo.func_split(@SQLStr, ',') 

El resultado será así

Resultado

… Ya que no hay una función incorporada en el servidor sql …

Eso fue cierto en el momento en que hizo esta pregunta, pero SQL Server 2016 presenta STRING_SPLIT .

Entonces puedes usar

 SELECT value FROM STRING_SPLIT ('apple,banana,pineapple,grapes', ',') 

Hay algunas limitaciones (solo se aceptan delimitadores de caracteres individuales y la ausencia de una columna que indique que el índice de división sea el más llamativo). Las diversas restricciones y algunos resultados prometedores de las pruebas de rendimiento se encuentran en esta publicación de blog de Aaron Bertrand .

Puede convertir sus datos a XML, reemplazando la coma por una etiqueta personalizada, en este caso, por palabra.

 create table t(col varchar(255)); insert into t values ('apple,banana,pineapple,grapes'); insert into t values ('car,bike,airplane'); select cast(('' + replace(col, ',', '') + '') as xml) as xmlValue from t 

Que devuelve

 | XMLVALUE | |--------------------------------------------------------| | applebananapineapplegrapes | | carbikeairplane | 

Ahora, si utiliza esta consulta como una selección interna de xml, la consulta externa puede dividirla en distintas filas:

Solución:

 select split.xmlTable.value('.', 'varchar(255)') as xmlValue from ( select cast(('' + replace(col, ',', '') + '') as xml) as xmlValue from t ) as xmlTable cross apply xmlValue.nodes ('/w') as split(xmlTable); 

Live sqlFiddle