SQL Server divide el CSV en varias filas

Me doy cuenta de que esta pregunta ha sido formulada antes, pero no puedo hacer que funcione por alguna razón.

Estoy usando la función de división de este subproceso de equipo de SQL (segunda publicación) y las siguientes consultas.

--This query converts the interests field from text to varchar select cp.id ,cast(cp.interests as varchar(100)) as interests into #client_profile_temp from client_profile cp --This query is supposed to split the csv ("Golf","food") into multiple rows select cpt.id ,split.data from #client_profile_temp cpt cross apply dbo.split( cpt.interests, ',') as split <--Error is on this line 

Sin embargo, estoy obteniendo un

 Incorrect syntax near '.' 

error donde he marcado arriba.

Al final, quiero

 ID INTERESTS 000CT00002UA "Golf","food" 

ser

 ID INTERESTS 000CT00002UA "Golf" 000CT00002UA "food" 

Estoy usando SQL Server 2008 y baso mi respuesta en esta pregunta de StackOverflow . Soy bastante nuevo en SQL así que cualquier otra palabra de sabiduría sería apreciada también.

 from #client_profile_temp cpt cross apply dbo.split( #client_profile_temp.interests, ',') as split <--Error is on this line 

Creo que la nomenclatura explícita de #client_profile_temp después de darle un alias es un problema, intente hacer esa última línea:

  cpt.interests, ',') as split <--Error is on this line 

EDITAR Tu dices

Hice este cambio y no cambió nada

Intente pegar el código siguiente (en una nueva ventana de SSMS)

 create table #client_profile_temp (id int, interests varchar(500)) insert into #client_profile_temp values (5, 'Vodka,Potassium,Trigo'), (6, 'Mazda,Boeing,Alcoa') select cpt.id ,split.data from #client_profile_temp cpt cross apply dbo.split(cpt.interests, ',') as split 

Vea si funciona como espera; Estoy usando sql server 2008 y eso me funciona para obtener el tipo de resultados que creo que quieres.

¿Alguna posibilidad cuando dices "Hice el cambio", acabas de cambiar un procedimiento almacenado pero no lo has ejecutado, o has cambiado un script que crea un procedimiento almacenado, y no has ejecutado eso, algo similar a eso? Como digo, parece funcionar para mí.

MESA

 x-----------------x--------------------x | ID | INTERESTS | x-----------------x--------------------x | 000CT00002UA | Golf,food | | 000CT12303CB | Cricket,Bat | x------x----------x--------------------x 

MÉTODO 1: utilizando el formato XML

 SELECT ID,Split.a.value('.', 'VARCHAR(100)') 'INTERESTS' FROM ( -- To change ',' to any other delimeter, just change ',' before '' to your desired one SELECT ID, CAST ('' + REPLACE(INTERESTS, ',', '') + '' AS XML) AS Data FROM TEMP ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a) 
  • FIDDLE SQL

MÉTODO 2: Usar la función dbo.Split

 SELECT a.ID, b.items FROM #TEMP a CROSS APPLY dbo.Split(a.INTERESTS, ',') b 
  • FIDDLE SQL

Y la función dbo.Split está aquí.

 CREATE FUNCTION [dbo].[Split](@String varchar(8000), @Delimiter char(1)) returns @temptable TABLE (items varchar(8000)) as begin declare @idx int declare @slice varchar(8000) select @idx = 1 if len(@String)<1 or @String is null return while @idx!= 0 begin set @idx = charindex(@Delimiter,@String) if @idx!=0 set @slice = left(@String,@idx - 1) else set @slice = @String if(len(@slice)>0) insert into @temptable(Items) values(@slice) set @String = right(@String,len(@String) - @idx) if len(@String) = 0 break end return end 

RESULTADO FINAL

enter image description here

Prueba esto:

 --This query is supposed to split the csv ("Golf","food") into multiple rows select cpt.id ,split.data from #client_profile_temp cpt cross apply dbo.split(cpt.interests, ',') as split <--Error is on this line 

Debe usar alias de tabla en lugar de nombre de tabla tan pronto como lo defina.