Tsql TVP-它们是否用于输入和输出?

Tsql TVP-它们是否用于输入和输出?,tsql,sql-server-2008-r2,Tsql,Sql Server 2008 R2,我已经开始阅读关于表值参数的注释 这些TVP可以用作输入参数和输出参数吗? 将它们作为输出参数有意义吗? 我感觉可能会有一个TVP作为一个存储过程的输出,然后再输入另一个存储过程-可能吗? 调用第一个存储过程,然后使用第一个存储过程的输出TVP调用第二个存储过程的脚本的语法是我不确定的 编辑 为我的帖子的混乱道歉-似乎初始程序结果需要进入TVP-我认为TVP需要参与到这场狂欢中。所以我所说的一个模型是下面的-希望是TVPs的有效使用 CREATE TYPE myfirstTVP AS T

我已经开始阅读关于表值参数的注释

这些TVP可以用作输入参数和输出参数吗?
将它们作为输出参数有意义吗?
我感觉可能会有一个TVP作为一个存储过程的输出,然后再输入另一个存储过程-可能吗?
调用第一个存储过程,然后使用第一个存储过程的输出TVP调用第二个存储过程的脚本的语法是我不确定的

编辑

为我的帖子的混乱道歉-似乎初始程序结果需要进入TVP-我认为TVP需要参与到这场狂欢中。所以我所说的一个模型是下面的-希望是TVPs的有效使用

CREATE TYPE myfirstTVP AS TABLE (id INT NOT NULL PRIMARY KEY);

GO --<<this sproc will find the ids (+ other fields) that need to be investigated
    CREATE PROC test1 as
        SELECT 1 UNION 
        SELECT 2 UNION
        SELECT 3;
GO

GO --<<this sproc uses the found ids to do one aspect of the investigation
    CREATE PROC test2 
    @t2 myfirstTVP READONLY 
    AS
            SELECT id*2 
            FROM @t2;
GO

GO --<<this sproc uses the found ids to do another aspect of the investigation
    CREATE PROC test3 
    @t4 myfirstTVP READONLY 
    AS
            SELECT id*3 
            FROM @t4;
GO    

    --<<this is where the TVP is used and the sprocs are called 
    DECLARE @t3 myfirstTVP ;
    INSERT INTO @t3 
    EXEC test1;

    EXEC test2 @t3;
    EXEC test3 @t3;
创建类型myfirstTVP作为表(id INT非空主键);

GO--我想你错过了你引用的MSDN链接中的这一点

表值参数必须作为输入只读参数传递给 Transact-SQL例程


我不是100%确定您想要实现什么,但您可以在某种意义上模拟“输出”参数的行为

CREATE TYPE LIST_OF_INT AS TABLE (id int not null primary key);
GO
create procedure test1 as
begin
  declare @t1 LIST_OF_INT;
  insert into @t1 (id) values (1);
  select * from @t1;
end;

GO

declare @t2 LIST_OF_INT ;
insert into @t2 
EXEC test1;

select * from @t2;

您可以将TVP传递给第二个存储过程,但请记住TVP是只读的,因此在传递之前,您不能在当前过程中对其执行任何操作。至于输出参数,不确定,您能解释一下潜在的用例吗?@AaronBertrand Hello。我有5个狂欢节。我运行的第一个存储过程将生成一个5个字段宽的表,可能有20行-我想这可能是一个输出TVP。然后,所有其他4个存储过程都将此TVP用作输入参数。可能吗?我还是不明白输出在哪里有意义。如果将TVP传递给一个存储过程,然后需要将其传递给另一个存储过程,只需将其作为输入直接传递即可。第一个存储过程无法更改它,因此再次将其拉出会增加什么值?第一个存储过程无法更改它?它的结构是什么?里面的数据是什么?你可以插入TVP一次,就是这样吗?我希望第一个存储过程将数据放入TVP,而其他存储过程只需读取数据即可填充TVP,然后直接将其传递到其他过程。不能将TVP传递到存储过程中,然后对其进行更改或插入更多数据。你似乎遗漏了一个关键词:
READONLY
ok-有点模糊的问题;我只会向TVP添加一次信息;然后我将把它输入到4或5个其他存储过程中-可能吗?@为什么我无法想象你所说的代码-你试过了吗?@AaronBertrand我将向OP中添加代码-似乎TVP在thr first sproc+1中是必需的,因为这可能是TVP最重要的属性之一让我来看看你的示例并尝试建立一个模型我想要达到的目标