【问题标题】:Pass test data to table-valued parameter within SQL将测试数据传递给 SQL 中的表值参数
【发布时间】:2017-03-31 13:58:22
【问题描述】:

是否可以,如果可以,如何使用 SQL EXEC 将数据传递给存储函数的表值参数?

我知道如何从 C# 传递数据。我使用表值参数的四个存储过程之一没有产生预期的结果。我想从 SQL Server Management Studio 执行我的 proc 以进行调试,但我无法找到这样做的正确语法,如果这样的语法甚至存在的话。我在文档中没有找到任何相关的内容。

我的类型表:

CREATE TYPE [MyNameSpace].[MyTypeTable] AS TABLE( 
//... all my fields
)

我的存储过程:

//... bunch of stuff
ALTER PROCEDURE [MyNameSpace].[MyStoredProc]
@MyTypeTableVar MyTypeTable READONLY 
AS
BEGIN
//Do a bunch of stuff
//Want to test the stuff in here
END

我试过了:

IF OBJECT_ID('tempdb.dbo.#MyTempTable') IS NOT NULL DROP TABLE tempdb.dbo.#MyTempTable;
select top 0 *
into #MyTempTable
//existing table with structure that matches the table-valued param
from MyNameSpace.MyTable;

//...Long insert statement assigning test data to #MyTempTable

EXECUTE MyNameSpace.MyStoredProc @MyTypeTableVar = #MyTempTable;

抛出:

操作数类型冲突:nvarchar 与 MyTypeTable 不兼容

【问题讨论】:

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


    【解决方案1】:

    您不能使用临时表 - 您必须使用 table variable

    declare @t [MyNameSpace].[MyTypeTable]
    insert into @t (/*columns*/) values
    (/* first row */),
    (/* second row */)
    
    EXECUTE MyNameSpace.MyStoredProc @MyTypeTableVar = @t;
    

    (如果您有一个包含您关心的数据的现有表,您可以使用INSERT ... VALUES 填充它,如上所示或INSERT ... SELECT

    【讨论】:

      【解决方案2】:

      这是一个工作示例:

      -- Declare a table parameter
      DECLARE @registryUpdates AS typ_KeyValuePairStringTable;
      -- Insert one row
      INSERT INTO @registryUpdates 
      VALUES ('Hello', 'World');
      -- Call Stored Procedure
      EXEC prc_UpdateRegistry @registryUpdates
      

      【讨论】:

        猜你喜欢
        • 2021-05-25
        • 2015-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多