在 SQL 中返回或输出 @tableVariable

Posted

技术标签:

【中文标题】在 SQL 中返回或输出 @tableVariable【英文标题】:Returning or outputting a @tableVariable in SQL 【发布时间】:2012-11-30 11:12:03 【问题描述】:

是否可以在 SQL Server 中返回或输出 @tableVariable? 比如下面的存储过程,如何返回@TSV表变量?

ALTER PROCEDURE MyStoredProdecure
    @Parameter1 INT,
    @Parameter2 INT
AS
   BEGIN

   DECLARE @TSV TABLE
   (
      Transition_Set_Variable_ID INT,
      Passed BIT
   )

   INSERT INTO @TSV
    some data 

END

【问题讨论】:

【参考方案1】:

你不能直接这样做。表变量对 READONLY 输入有效。

如果您没有从存储过程中返回其他数据,您可以从最后的@TSV 中选择并让调用者捕获输出,例如

ALTER PROCEDURE MyStoredProdecure
    @Parameter1 INT,
    @Parameter2 INT
AS
   BEGIN

   DECLARE @TSV TABLE
   (
      Transition_Set_Variable_ID INT,
      Passed BIT
   )

   INSERT INTO @TSV
    some data 

   SELECT * FROM @TSV
END

来电者

DECLARE @outerTSV TABLE
(
   Transition_Set_Variable_ID INT,
   Passed BIT
);
insert into @outerTSV
exec MyStoredProdecure 1, 2;

或者,如果 SP 真的像您展示的那样简单,请将其转换为表值函数。

【讨论】:

【参考方案2】:

不,但你可以写一个 table valued function 来返回一个表。

create function MyTVF
    @Parameter1 INT,
    @Parameter2 INT
returns @tsv table
   (
      Transition_Set_Variable_ID INT,
      Passed BIT
   )

AS
   BEGIN
   INSERT INTO @TSV
    some data 
   return 
END

【讨论】:

【参考方案3】:

表值参数只能用于输入,不能用于输出。

根据您的最终目标,这里有一些选项:

    将存储过程更改为表值函数以返回 TABLE,然后可以在另一个语句中内联使用它

    只需从 sproc 末尾的 @TSV 表 var 中选择数据

    返回一个 XML OUTPUT 参数(得到一个肮脏的感觉,建议这样做,但只是强调一种实际使用 OUTPUT 参数返回多行的方法)

如果您选择表值函数,最好创建一个内联函数,前提是它看起来很简单:

例如

CREATE FUNCTION dbo.Func() 
RETURNS TABLE 
AS
RETURN
(
    SELECT Something
    FROM Somewhere
    WHERE x = 1
)

【讨论】:

以上是关于在 SQL 中返回或输出 @tableVariable的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL轻量版——存储函数/存储过程

ORACLE 存储函数

SQL 之存储过程

PL/SQL程序设计—— 存储函数&存储过程

在C#中返回并使用sql输出参数

PL-SQL 存储函数和存储过程