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

时间:2009-04-18 16:04:49

标签: sql sql-server string csv string-split

我有以下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

...

我的期望是我应该从@ test.ID获取一个ID表,并且@ test.data中的每个逗号分隔值都会被拆分为自己的记录,并将其值放入dataItem字段

我怎样才能做到这一点? 我需要使用游标吗?

我在http://pastebin.com/f7dd6350f

粘贴了dbo .__ StringSplit表值函数实现

谢谢!

2 个答案:

答案 0 :(得分:3)

在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

这解决了我的问题: - )

答案 1 :(得分:1)

你的分裂字符串函数非常慢,这里有一个链接可以更快一些:

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