我有一个 UDF,它接受一个表作为参数(一个 2 列表)并输出一个字符串,就像这样 article 。我有一个表,我想将 UDF 应用到多个列,如下所示:
Date Unit Line Revenue Orders
4/1/12 D R 20.00 3
4/2/12 D R 25.00 4
4/1/12 H W 33.00 1
4/2/12 H W 35.00 3
我想在此表中具有最新日期的每一行上调用我的 UDF,并向 UDF 传递一个表,其中包含每个不同单位和行的日期和收入列。我还想调用 UDF 并传递每个不同单元和行的日期和订单。这是一份报告,UDF 将始终传递日期列和我想要应用一些计算并存储和报告的另一列。所以我看了很多东西,包括交叉应用,我想做这样的事情:
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
这给我带来了错误“当子查询未通过 EXISTS 引入时,只能在选择列表中指定一个表达式。”我查看了 CROSS APPLY 但这似乎只适用于返回表变量时。因此,我可能可以通过使用游标和循环来回答我自己的问题,并构建我想要在每次循环迭代中传递给 UDF 的每个表,但这似乎并不正确。任何人都可以告诉我如何在 SQL Server 2008 中执行我想要的操作吗?
最佳答案
不能像这样使用子查询来返回查询的 SELECT 部分中的表变量。它们只能返回单个值。如:
set @myParam = (select myvalue from table where primarykey = 1)
或
set @myParam = (select top 1 myvalue from table)
但是,考虑到您的子查询与所选行没有任何关系,您可以执行类似的操作。
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
关于SQL - 将表传递给 Select 中的 UDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10417148/