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

...

我所期望的是,我应该得到一个表,其中的 ID 来自 @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

编辑 - 我发现 交叉申请上的此页面 然后想出:

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

这解决了我的问题:-)

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top