在多行上执行表值函数?

时间:2009-01-18 10:44:10

标签: sql sql-server-2005 tsql user-defined-functions

给定一个表值函数,例如来自"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)

2 个答案:

答案 0 :(得分:50)

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,'') <> ''

答案 1 :(得分: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))

我不知道那会比使用游标更好。