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 |

我现在需要在一系列 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 */
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 回答