2012-04-16 6 views
2

特定のアカウントに関する詳細を返すテーブル値関数があります。このようなもの。もっと複雑ですが、あなたはそのアイデアを得ることができます。それが違い(ないインライン声明)を行う場合は、複数行TVFをだテーブル値関数で一連のunion文を実行する非動的アプローチtvf

select * from dbo.TBFDetailsByAccountKey(1234) 

----------------------------------------------- 
date  | amount |  detail  | 
----------------------------------------------- 
4/1/2012 | 10.23  | payment stuff | 
4/2/2012 | 12.40  | other stuff  | 
4/2/2012 | 14.23  | second pmt today | 

私は今、すべてのアカウントの詳細情報を返すためにUNION一連の繰り返しALL文をこの同じTVFを呼び出す必要がありますしています鍵は一連の預金に含まれています。動的SQLに頼らずにこれを行う方法はありますか?

私の現在のアプローチはこれですが、ダイナミックSQLを使用しており、より良い「非動的」な方法が必要であると考え続けています。

DECLARE @pResult varchar(max) 

SELECT @pResult = COALESCE(@pResult + ' UNION ALL ', '') + 
     'SELECT * FROM dbo.TBFDetailsByAccountKey(' + 
     Cast(AccountKey AS VarChar(25)) + ')' 
    FROM Account WHERE DepositKey = @pDepositKey 

EXEC(@pResult) /* execute dynamic sql created above */ 

答えて

3

CROSS APPLYはこの正確な仕事をするために設計されていたようです:

SELECT AccountDetails.* 
FROM Account 
CROSS APPLY 
(
    select * 
    from dbo.TBFDetailsByAccountKey(Account.AccountKey) 
) AccountDetails 
WHERE Account.DepositKey = @pDepositKey 
+0

うん、それは私が必要なものを...何か新しい日常を学ぶのです。 – RThomas

関連する問題