2016-02-01 75 views
0

我有一个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 * FROM @TransTVP 

我什么也没得到。如果我在一个单独的窗口中运行这个代码(声明了@TransTable变量和#tmpTable中的数据,然后运行一个select - 我得到了数据。但不知何故,我在strInsertTrans中声明的表值参数不一样该表值参数,我宣布在执行strInsertTrans的SP

作为替代,我想:

EXEC sp_executesql @strInsertTrans, N'@TransTVP TransactionTableType out', @TransTVP out 

但我得到的错误:

The table variable "@TransTVP" can not be passed to a stored procedure with the OUTPUT option.

此表值参数是将被用于呼叫另一个SP我应该包括ude 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变量;为什么我不能直接执行插入语句?答案是,因为还有其他的变量需要我使用strInsertTrans,然后执行strInsertTrans,所以我不会在这里显示它们。相信我! ;-)我需要执行一个字符串。但是我需要执行该字符串的结果中的数据。而且我无法弄清楚如何为最后一次通话引用它。

回答

1

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

+0

感谢您的回复。这是我在我的帖子后不久预期的答复。但是我使用这些tvp有大约7种不同的程序。并且共有三个TVP。这意味着每个程序需要3个临时表。 –

+0

为了进一步阐述,我知道最有可能有多种方式来解决我的问题,但考虑到使用它们的传统程序和流程,我必须与我现在拥有的东西做一下。而我所拥有的是多个流程,都可以做3件事 - 但方式各不相同。这就是 - 将数据回传到3个表格。每个表都有它自己的过程,可处理收到的用于回发的数据的所有细微差别。每个处理程序必须将数据存入TVP,这三个通用程序各有一个。 –

相关问题