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