当前位置:  开发笔记 > 数据库 > 正文

在多行上执行表值函数?

如何解决《在多行上执行表值函数?》经验,为你挑选了1个好方法。

给定一个表值函数,如dbo.Split()从"T-SQL:对面字符串连接-如何将字符串分割成多个记录",我如何通过多行作为参数?

这有效:

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

文档说:

当在子查询的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,

id是一个int; myColumn是一个varchar(max).



1> Cade Roux..:

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


@tgandrews当Results.s =''时它们不相等 - 所以isnull(Results.s,'')<>''也过滤掉空字符串.如果这不是可能的输出,那么就没有必要了.这是在最初的问题,所以我只是保持这种技术.
推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有