将用户定义的表传递给存储过程

14

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

DECLARE @tmpInput MyTableType;

--Table is populated from an INPUT XML

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

现在这个不会给我错误,但是当我从ValidateInputXML运行一个选择时,表格没有数据。

2个回答

30

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

/* 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

我不确定是否可以直接将记录集传递给存储过程而不使用表类型。再考虑一下。 - vendettamit
1
这是我们采用的解决方案风格。 - Steven
我正在使用SQL Server 2014。当我运行以下代码时,会出现错误“关键字'AS'附近的语法不正确。”CREATE TYPE MyTableType AS TABLE ( Column1 VARCHAR(50)); GO - CowboyBebop

0

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

从文档中可以看出:

变量的作用域持续时间从它声明的时刻开始,直到批处理或存储过程结束为止。

您有两个选择:

选项1:

创建一个表,以便您可以永久存储记录。

选项2:

在存储过程内部选择记录,例如:

alter procedure ValidateInputXML 
DECLARE @tmpInput MyTableType;

--Table is populated from an INPUT XML

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

然后

exec ValidateInputXML 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接