2009-01-18 104 views
31

"T-SQL: Opposite to string concatenation - how to split string into multiple records"获得表值函数,如dbo.Split(),如何传递多行作为参数?在多行上执行表值函数?

这工作:

SELECT * 
FROM dbo.Split 
    (',', (SELECT myColumn FROM Stuff WHERE id = 22268)) 
WHERE ISNULL(s,'') <> '' 

它返回:

pn   s 
----------- ----------- 
1   22351 
2   22354 
3   22356 
4   22357 
5   22360 

但这并不:

SELECT * 
FROM dbo.Split 
    (',', (SELECT myColumn FROM Stuff)) 
WHERE ISNULL(s,'') <> '' 

也没有这样的:

SELECT * FROM dbo.Split_temp(',', myColumn), Stuff 

The docs说:

当返回一个表中的用户定义的函数在被调用FROM子查询的子句,函数参数不能从外部查询引用任何列。

排序结果集我正在寻找看起来像:

id   pn   s 
----------- ----------- ----------- 
22268  1   22351 
22268  2   22354 
22268  3   22356 
22268  4   22357 
22268  5   22360 
24104  1   22353 
24104  2   22355 
24104  3   22356 
24104  4   22358 
24104  5   22360 
24104  6   22362 
24104  7   22364 
. 
. 
. 

有没有办法在所有(除,当然,光标)来做到这一点?

(编辑)

按照要求通过MarlonRibunal,一个试样台,以产生上述的结果如下所示:

id   myColumn 
----------- ------------------------------------------- 
22268  22351,22354,22356,22357,22360, 
24104  22353,22355,22356,22358,22360,22362,22364, 

idint; myColumnvarchar(max)

回答

48

OUTER APPLY

SELECT Stuff.id 
    ,Results.pn 
    ,Results.s 
FROM stackoverflow_454945 AS Stuff 
OUTER APPLY dbo.Split(',', Stuff.myColumn) AS Results 
WHERE ISNULL(Results.s,'') <> '' 
+0

太棒了! 第二个“FROM Stuff”实际上被标记为语法错误,但在删除之后,该语句完全符合我的要求。谢谢。 – 2009-01-18 13:41:39

0

你可以使用COALESCE级联行为

declare @split varchar(max) 
set @split = '' 

select @split = @split + Coalesce(myColumn + ',' , ' ') 
from Stuff 
WHERE id = 22268 

select * from dbo.Split(',', @Left(@split,len(@split) -1)) 

我不知道,这将是比任何使用游标更好。

+0

AIUI,将不保留该行的各个ID,只有价值。 – 2009-01-18 11:56:50