SQL – Transmettre la table à un file UDF dans une sélection

J'ai un UDF qui prend une table en tant que paramètre (une table de 2 colonnes) et sort une string, un peu comme cet article . J'ai une table que je veux appliquer l'UDF sur plusieurs colonnes comme ceci:

Date Unit Line Revenue Orders 4/1/12 DR 20.00 3 4/2/12 DR 25.00 4 4/1/12 HW 33.00 1 4/2/12 HW 35.00 3 

Je souhaite appeler mon file UDF sur chaque ligne de cette table qui contient la date la plus récente et transmettre à l'UDF un tableau avec les colonnes Date et Chiffre d'affaires pour chaque unité et ligne distinctes. Et je veux également appeler l'UDF et passer la date et les commands pour chaque unité et ligne distinctes. Il s'agit d'un rapport et la fonction UDF recevra toujours la colonne Date et une autre colonne à laquelle je souhaite appliquer des calculs et stocker et générer des rapports. Donc, j'ai regardé beaucoup de choses, y compris CROSS APPLY et je veux faire quelque chose comme ça:

 SELECT T.unit , T.line , dbo.fn_myUDF((SELECT T2.Date, T2.Revenue FROM #Table T2)) as UDFRevenueResult , dbo.fn_myUDF((SELECT T2.Date, T2.Orders FROM #Table T2)) as UDFOrderResult FROM #Table T WHERE T.Date = @ReportDate 

Cela me donne l'erreur "Une seule expression peut être spécifiée dans la list de sélection lorsque la sous-requête n'est pas introduite avec EXISTS." J'ai regardé CROSS APPLY mais cela ne s'applique que lorsque vous renvoyez une variable de table. Donc, je pourrais probablement répondre à ma propre question en utilisant un slider et une boucle peut-être et en construisant chaque table que je veux passer à l'UDF dans chaque itération de la boucle, mais cela ne semble pas juste. Quelqu'un peut-il me donner une idée de comment faire ce que je veux dans SQL Server 2008?

Les sous-requêtes ne peuvent pas être utilisées de cette manière pour renvoyer des variables de table dans la partie SELECT de la requête. Ils ne peuvent renvoyer qu'une seule valeur. Un péché:

 set @myParam = (select myvalue from table where primarykey = 1) 

ou

 set @myParam = (select top 1 myvalue from table) 

Mais, étant donné que vos sous-requêtes n'ont aucun lien avec les lignes sélectionnées, vous pouvez faire quelque chose comme ça.

 declare @t1 table (DateTime c1, float c2) insert @t1 SELECT Date, Revenue FROM #Table declare @t2 table (DateTime c1, int c2) -- not sure on data type of 'Orders' insert @t2 SELECT Date, Orders FROM #Table SELECT T.unit , T.line , dbo.fn_myUDF(@t1) as UDFRevenueResult , dbo.fn_myUDF(@t2) as UDFOrderResult FROM #Table T WHERE T.Date = @ReportDate