web-dev-qa-db-ja.com

複数の行でテーブル値関数を実行しますか?

dbo.Split() from "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,
_

idintです。 myColumnvarchar(max)です。

31
Sören Kuklau

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,'') <> ''
50
Cade Roux

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
cmsjr