Vraag Tafelwaardige functie uitvoeren op meerdere rijen?


Gegeven een tabel-gewaardeerde functie zoals dbo.Split() van "T-SQL: tegengesteld aan string concatenation - hoe u een string opsplitst in meerdere records", hoe pas ik meerdere rijen door als argumenten?

Dit werkt:

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

Het geeft terug:

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

Maar dit betekent niet:

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

Dit ook niet:

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

De documenten zeggen:

Wanneer een door de gebruiker gedefinieerde functie die een tabel retourneert, wordt aangeroepen in de FROM-component van een subquery, kunnen de functieargumenten niet verwijzen naar kolommen uit de outerquery.

Het soort resultatenset waar ik naar op zoek, zou er ongeveer zo uitzien:

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
.
.
.

Is er een manier (afgezien van, natuurlijk, een cursor) om dit te bereiken?

(Bewerk)

Zoals gevraagd door MarlonRibunal, ziet een voorbeeldtabel om het bovenstaande resultaat te produceren eruit als:

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

id is een int; myColumn is een varchar(max).


31
2018-01-18 10:44


oorsprong


antwoorden:


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

49
2018-01-18 13:23



U kunt het COALESCE-concatenatiegedrag gebruiken

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

Ik weet niet dat dat beter zou zijn dan het gebruik van een cursor.


0
2018-01-18 11:17