T-SQL将字符串拆分为多对一的关系?

问题描述:

我有以下SQL脚本:T-SQL将字符串拆分为多对一的关系?

DECLARE @temp table (
    ID int IDENTITY(1, 1), 
    data nvarchar(100) 
) 

INSERT INTO @temp (data) VALUES ('a,b,c') 
INSERT INTO @temp (data) VALUES ('d,e,f') 

SELECT * 
FROM @temp AS T 
    INNER JOIN 
     (SELECT * 
     FROM dbo.__StringSplit(T.data, ',', T.ID)) AS S 
    ON T.ID = S.RefID 
点击后

而且在执行,我得到了这些:

Line 17 The multi-part identifier "T.data" could not be bound. 

我也曾尝试非联接版本,并得到了同样的错误:

SELECT T.ID, S.Item AS dataItem 
FROM @temp AS T, dbo.__StringSplit(T.data, ',', T.ID) AS S 
WHERE T.ID = S.RefID 

...

w ^帽子我希望的是,我应该得到与标识从@ test.ID和@ test.data每个逗号分隔值被分成了自己的记录,它的价值投入的DataItem领域未来的表。

我怎样才能做到呢?
我是否需要使用游标?

我已经粘贴了DBO .__ StringSplit表值函数的实现在http://pastebin.com/f7dd6350f

谢谢!

+0

你仍然会使用交叉适用,但有一个在我的答案链接替换拆分字符串函数。 – 2009-04-21 15:14:18

在SQL2000你需要游标。在SQL2005/2008中,您可以使用CROSS APPLY语句;未来可能像(不能只是现在测试):

SELECT T.ID, S.Item AS dataItem 
FROM @temp AS T CROSS APPLY dbo.__StringSplit(T.data, ',', T.ID) AS S 

编辑 - 我发现this page on CROSS APPLY,然后想出了:

SELECT T.ID, S.Item AS dataItem 
FROM @temp AS T 
    CROSS APPLY 
    dbo.__StringSplit(T.data, ',', T.ID) AS S 
WHERE T.ID = S.RefID 

这解决了我的问题:-)

+0

CROSS APPLY就像一个魅力!谢谢! – chakrit 2009-04-18 16:35:15

将拆分字符串函数实在是太慢了,这里是让链接更快的一个:

http://www.sommarskog.se/arrays-in-sql.html

+0

感谢您指出:-) – chakrit 2009-04-21 14:36:07