2

我有以下 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 字段中。

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

我已将 dbo.__StringSplit 表值函数实现粘贴在http://pastebin.com/f7dd6350f

谢谢!

4

2 回答 2

3

In SQL2000 you need cursors. In SQL2005/2008, you can use CROSS APPLY satement; probably like next (can't test just now):

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

EDIT - I found this page on CROSS APPLY and then came up with:

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

Which solved my problem :-)

于 2009-04-18T16:26:32.437 回答
1

你的分割字符串函数真的很慢,这里有一个链接可以更快:

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

于 2009-04-20T21:55:56.420 回答