2

特定のアカウントに関する詳細を返すテーブル値関数があります。このようなもの。はるかに複雑ですが、あなたはその考えを理解します。それが違いを生むのであれば、それは複数行の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 |

一連の預金に含まれるすべてのアカウントキーの詳細を返すために、一連のUNIONALLステートメントでこの同じ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 */
4

1 に答える 1

3

CROSS APPLYは、まさにこの仕事をするように設計されているようです。

SELECT AccountDetails.*
FROM Account
CROSS APPLY
(
  select * 
    from dbo.TBFDetailsByAccountKey(Account.AccountKey)
) AccountDetails
WHERE Account.DepositKey = @pDepositKey
于 2012-04-16T18:22:55.550 に答える