SQL Server将CSV拆分为多行

时间:2012-03-21 19:03:28

标签: sql-server

我之前已经意识到这个问题,但我不能因为某种原因让它工作。

我正在使用this SQL Team thread(第二篇文章)中的拆分功能和以下查询。

--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

但是我得到了

Incorrect syntax near '.'

我在上面标记的错误。

最后,我想要

ID              INTERESTS
000CT00002UA    "Golf","food"

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

我正在使用SQL Server 2008并将我的答案基于this StackOverflow question。我对SQL很陌生,所以任何其他智慧的话也会受到赞赏。

3 个答案:

答案 0 :(得分:7)

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

我认为#client_profile_temp在给它别名后显式命名是个问题,请尝试制作最后一行:

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

编辑你说

  

我做了这个改变并没有改变任何东西

尝试粘贴下面的代码(进入新的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 

看看它是否按预期工作;我正在使用sql server 2008,这对我来说可以得到我认为你想要的那种结果。

当你说“我做了改变”时,你只是改变了一个存储过程但没有运行它,或者改变了一个创建存储过程的脚本,并且还没有运行它,那么就有这样的机会吗?正如我所说,它似乎对我有用。

答案 1 :(得分:6)

表格

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


方法1:使用XML格式

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

方法2:使用函数dbo.Split

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

dbo.Split功能就在这里。

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

最终结果

enter image description here

答案 2 :(得分:0)

试试这个:

--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 

一旦定义,就必须使用表别名而不是表名。