在程序执行中使用表值参数

时间:2016-02-01 23:56:48

标签: sql sql-server table-valued-parameters

我有一个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,我只是不在这里显示它们。相信我! ;-)我需要执行一个字符串。但我需要执行该字符串的结果中的数据。我无法弄清楚如何在上一次电话中引用它。

1 个答案:

答案 0 :(得分:1)

使用EXEC()时,传入的代码将在新的词法范围内执行。这就是你必须在字符串中声明@TransTVP的原因,因为它不在范围内。但是你所做的只是创建另一个与外部变量无关的表变量。如果要获取数据,最简单的方法是使用临时表而不是表值变量。如果需要,您始终可以在EXEC()之后将临时表中的数据复制到表值变量中。