我有一个s.p.声明一个表值参数。 我已经创建了一个TransactionTableType。
DECLARE @TransTVP AS TransactionTableType
为了将不同的数据插入此TVP,我必须以编程方式创建并执行字符串:
SET @strInsertTrans = N'DECLARE @TransTVP AS TransactionTableType INSERT
INTO @TransTVP (Value1, Value2, Value3) SELECT Value1, Value2, Value3
FROM #tmpTable WHERE ...
然后我执行:
EXEC (@strInsertTrans)
问题是 - 当我运行一个select语句时:
SELECT * FROM @TransTVP
我一无所获。如果我在一个单独的窗口中运行此代码(使用声明的@TransTable变量,来自#tmpTable的数据,并运行一个select - 我得到数据。但不知何故,我在strInsertTrans中声明的表值参数不同于表值参数我在执行strInsertTrans的sp中声明。
作为替代方案,我尝试过:
EXEC sp_executesql @strInsertTrans, N'@TransTVP TransactionTableType out', @TransTVP out
但我收到错误:
表变量" @ TransTVP"无法使用OUTPUT选项传递给存储过程。
此表值参数将用于调用ANOTHER s.p.我应该包括s.p.在strInsertTrans中调用??或者更好的是,我如何获得存储在此TVP中的结果数据 - 用于我的s.p.那是创造它的。最终代码如下:
DECLARE @TransTVP AS TransactionTableType, strInsertTrans nvarchar(MAX)
CREATE #tmpTable (Value1 int, Value2 int, Value3 int)
SET @strInsertTrans = N'DECLARE @TransTVP AS TransactionTableType INSERT
INTO @TransTVP (Value1, Value2, Value3) SELECT Value1, Value2, Value3
FROM #tmpTable WHERE ...
EXEC (@strInsertTrans)
EXEC dbo.UseTableValueParameter @TransTVP
注意:有人可能会问我,为什么我必须使用strInsertTrans变量;为什么我不能直接执行insert语句?答案是,因为还有其他变量需要我使用strInsertTrans然后执行strInsertTrans,我只是不在这里显示它们。相信我! ;-)我需要执行一个字符串。但我需要执行该字符串的结果中的数据。我无法弄清楚如何在上一次电话中引用它。
答案 0 :(得分:1)
使用EXEC()
时,传入的代码将在新的词法范围内执行。这就是你必须在字符串中声明@TransTVP
的原因,因为它不在范围内。但是你所做的只是创建另一个与外部变量无关的表变量。如果要获取数据,最简单的方法是使用临时表而不是表值变量。如果需要,您始终可以在EXEC()
之后将临时表中的数据复制到表值变量中。