4

この記事のように、テーブルをパラメーター(2列のテーブル)として受け取り、文字列を出力するUDFがあります。次のように、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には常に[日付]列と、計算を適用して保存およびレポートする別の列が渡されます。だから私はCROSSAPPLYを含む多くのことを見てきました、そして私はこのようなことをしたいと思います:

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で導入されていない場合、選択リストで指定できる式は1つだけです」というエラーが発生します。CROSS APPLYを見ましたが、これはテーブル変数を返す場合にのみ当てはまるようです。したがって、カーソルとループを使用して、ループの反復ごとにUDFに渡したい各テーブルを作成することで、おそらく自分の質問に答えることができますが、それは正しくないようです。SQL Server 2008でやりたいことを実行する方法を誰かに教えてもらえますか?

4

1 に答える 1

3

サブクエリをそのように使用して、クエリの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 
于 2012-05-02T15:57:22.673 に答える