【问题标题】:Pass A User-Defined Table to a Stored Procedure将用户定义的表传递给存储过程
【发布时间】:2015-05-28 19:17:35
【问题描述】:

我有一个用户定义的表,我从存储过程中传递到存储过程。

DECLARE @tmpInput MyTableType;

--Table is populated from an INPUT XML

exec ValidateInputXML SELECT * FROM @tmpInput TI WHERE TI.EntryType = 'Attribute';

现在这并没有给我一个错误,但是当我使用 ValidateInputXML 运行选择时,表中没有数据。

【问题讨论】:

    标签: sql-server stored-procedures sql-server-2008-r2 user-defined-types


    【解决方案1】:

    您还可以为存储过程使用表值参数。 例如。

    /* Create a table type. */
    CREATE TYPE MyTableType AS TABLE 
    ( Column1 VARCHAR(50)
    , ........ );
    GO
    
    /* Create a procedure to receive data for the table-valued parameter. */
    CREATE PROCEDURE dbo. ValidateInputXML
        @TVP MyTableType READONLY
        AS 
         -- Do what ever you want to do with the table received from caller
        GO
    
    /* Declare a variable that references the type. */
    DECLARE @myTable AS MyTableType;
    
    -- Fill @myTable with data and send it to SP. 
    insert into @myTable SELECT * FROM @tmpInput TI WHERE TI.EntryType = 'Attribute';
    
    
    /* Pass the table variable data to a stored procedure. */
    EXEC ValidateInputXML @myTable ;
    GO
    

    【讨论】:

    • 我不知道您是否可以在不使用表类型的情况下将记录集直接传递给存储过程。再想一想。
    • 这是我们采用的解决方案的风格。
    • 我使用的是 SQL Server 2014。当我运行以下命令时,我收到错误“关键字‘AS’附近的语法不正确。”创建类型 MyTableType 作为表(列 1 VARCHAR(50));去
    【解决方案2】:

    用户定义表的范围在存储过程中。执行存储过程后,将创建并填充表 @tmpInput,之后您将无法访问它。

    来自文档:

    变量的作用域从它被声明的那一刻开始一直持续到 声明它的批处理或存储过程的结尾。

    你有两个选择:

    选项 1:

    创建一个可以永久存储记录的表。

    选项 2:

    select 存储过程中的记录,例如:

    alter procedure ValidateInputXML 
    DECLARE @tmpInput MyTableType;
    
    --Table is populated from an INPUT XML
    
    SELECT * FROM @tmpInput TI WHERE TI.EntryType = 'Attribute';
    

    然后

    exec ValidateInputXML 
    

    【讨论】:

      猜你喜欢
      • 2010-11-02
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      相关资源
      最近更新 更多