Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Execute table-valued function on multiple rows?

Given a table-valued function such as dbo.Split() from "T-SQL: Opposite to string concatenation - how to split string into multiple records", how do I pass multiple rows as arguments?

This works:

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

It returns:

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

But this does not:

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

Nor does this:

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

The docs say:

When a user-defined function that returns a table is invoked in the FROM clause of a subquery, the function arguments cannot reference any columns from the outer query.

The sort of result set I'm looking for would look something like:

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 there any way at all (aside from, of course, a cursor) to accomplish this?

(edit)

As requested by MarlonRibunal, a sample table to produce the above result looks like:

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

id is an int; myColumn is a varchar(max).

like image 463
Sören Kuklau Avatar asked Jan 18 '09 10:01

Sören Kuklau


People also ask

Can function return multiple rows in SQL?

Alternatively, an SQL function can be declared to return a set (that is, multiple rows) by specifying the function's return type as SETOF sometype , or equivalently by declaring it as RETURNS TABLE( columns ) . In this case all rows of the last query's result are returned.

What is multi-statement table valued function?

Multi-statement table-valued function returns a table as output and this output table structure can be defined by the user. MSTVFs can contain only one statement or more than one statement. Also, we can modify and aggregate the output table in the function body.

What is table valued function?

A table function, also called a table-valued function (TVF), is a user-defined function that returns a table. You can use a table function anywhere that you can use a table. Table functions behave similarly to views, but a table function can take parameters.


1 Answers

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,'') <> '' 
like image 159
Cade Roux Avatar answered Oct 02 '22 16:10

Cade Roux