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

Sql server 将用户定义的表传递给存储过程,sql-server,stored-procedures,sql-server-2008-r2,user-defined-types,Sql Server,Stored Procedures,Sql Server 2008 R2,User Defined Types,我有一个用户定义的表,我正在将它从存储过程传递到存储过程中 DECLARE @tmpInput MyTableType; --Table is populated from an INPUT XML exec ValidateInputXML SELECT * FROM @tmpInput TI WHERE TI.EntryType = 'Attribute'; 现在这并没有给我一个错误,但是当我使用ValidateInputXML运行select from时,表中没有数据。用户定义表的范

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

DECLARE @tmpInput MyTableType;

--Table is populated from an INPUT XML

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

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

用户定义表的范围在存储过程中。执行存储过程后,将创建并填充表
@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 

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


我不知道是否可以在不使用表类型的情况下将记录集直接传递给存储过程。再考虑一下。这就是我们使用的解决方案的风格。我使用的是SQL Server 2014。当我运行以下命令时,我得到一个错误“关键字'AS'附近的语法不正确”。创建类型MyTableType AS TABLE(Column1 VARCHAR(50));去
/* 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