【问题标题】:Return multiple values from a SQL Server function从 SQL Server 函数返回多个值
【发布时间】:2010-09-21 16:43:50
【问题描述】:

如何从 SQL Server 中的用户定义函数返回多个值(例如,一个数字和一个字符串)?

【问题讨论】:

  • 也许你可以控制你的函数,让它返回一个带有一些分隔符的字符串,比如“result1|result2|result3”

标签: tsql user-defined-functions


【解决方案1】:

改成表值函数

例如请参考以下link

【讨论】:

  • 这个例子非常感谢你的链接。有没有办法从多个表中返回行?我想要的是为表 A 返回 1 行,从表 B 中返回 1 行......等等
【解决方案2】:

另一种选择是使用带有输出参数的过程 - Using a Stored Procedure with Output Parameters

【讨论】:

  • @Fernando68:所以? T-SQL 中的函数和存储过程非常相似。根据 OP 使用函数的位置,可能会将其转换为存储过程。如果是这样,那么这个问题就是xy problem 的一个例子,这个答案对手头的实际问题很有用。
【解决方案3】:

这是内联函数的查询分析器模板 - 默认情况下它返回 2 个值:

-- =============================================  
-- Create inline function (IF)  
-- =============================================  
IF EXISTS (SELECT *   
   FROM   sysobjects   
   WHERE  name = N'<inline_function_name, sysname, test_function>')  
DROP FUNCTION <inline_function_name, sysname, test_function>  
GO  

CREATE FUNCTION <inline_function_name, sysname, test_function>   
(<@param1, sysname, @p1> <data_type_for_param1, , int>,   
 <@param2, sysname, @p2> <data_type_for_param2, , char>)  
RETURNS TABLE   
AS  
RETURN SELECT   @p1 AS c1,   
        @p2 AS c2  
GO  

-- =============================================  
-- Example to execute function  
-- =============================================  
SELECT *   
FROM <owner, , dbo>.<inline_function_name, sysname, test_function>   
    (<value_for_@param1, , 1>,   
     <value_for_@param2, , 'a'>)  
GO  

【讨论】:

    【解决方案4】:

    Erland Sommarskog 有一篇关于在 SQL Server 中传递数据的详尽文章,位于此处:

    http://www.sommarskog.se/share_data.html

    他介绍了 SQL Server 2000、2005 和 2008,可能应该详细阅读它,因为对每种方法的优缺点都有充分的介绍。但是,为了提供可用于查看更多详细信息的搜索词,这里是文章的重点(截至 2015 年 7 月冻结):

    本文解决了两个相关问题:

    • 如何在另一个存储过程中使用结果集,也表示为如何使用存储过程中的结果集
      SELECT 语句中的过程?
    • 如何将参数中的表数据从一个存储过程传递到另一个存储过程?

    输出参数

    • 一般不适用,但有时会被忽视。

    表值函数

    • 通常是仅输出的最佳选择,但有一些限制。
    • 示例:
      • 内联函数:使用它来重用单个 SELECT。
      • 多语句函数:当您需要封装更复杂的逻辑时。

    使用表格

    • 最通用的解决方案。我最喜欢的输入/输出场景。
    • 示例:
      • 共享临时表:主要用于一对调用者/被调用者。
      • 进程键控表:同一被调用者的多个调用者的最佳选择。
      • 全局温度表:进程键控的变体。

    表值参数

    • 请求。版本:SQL 2008
    • 主要在从客户端传递数据时有用。

    插入执行

    • 具有欺骗性的吸引力,但应谨慎使用。

    使用 CLR

    • 请求。版本:SQL 2005
    • 复杂,但在 INSERT-EXEC 不起作用时作为最后的手段很有用。

    打开查询

    • 很棘手,有很多陷阱。气馁。

    使用 XML

    • 请求。版本:SQL 2005
    • 有点笨拙,但并非没有优势。

    使用游标变量

    • 不推荐。

    【讨论】:

      【解决方案5】:

      使用带有多个输出参数的存储过程的示例

      作为用户Mr. Brownstone 建议您可以使用stored procedure;为了方便所有人,我创建了一个极简主义示例。先create a stored procedure

      Create PROCEDURE MultipleOutParameter
          @Input int,
          @Out1 int OUTPUT, 
          @Out2 int OUTPUT 
      AS
      BEGIN
          Select @Out1 = @Input + 1
          Select @Out2 = @Input + 2   
          Select 'this returns your normal Select-Statement' as Foo
                , 'amazing is it not?' as Bar
      
          -- Return can be used to get even more (afaik only int) values 
          Return(@Out1+@Out2+@Input)
      END 
      

      调用存储过程

      execute the stored procedure 需要几个local variables 来接收值:

      DECLARE @GetReturnResult int, @GetOut1 int, @GetOut2 int 
      EXEC @GetReturnResult = MultipleOutParameter  
          @Input = 1,
          @Out1 = @GetOut1 OUTPUT,
          @Out2 = @GetOut2 OUTPUT
      

      要查看值内容,您可以执行以下操作

      Select @GetReturnResult as ReturnResult, @GetOut1 as Out_1, @GetOut2 as Out_2 
      

      这将是结果:

      【讨论】:

      • 很抱歉,但问题又与函数有关,而不是存储过程,似乎回答这个问题的唯一方法是使用表值函数,如上所述。跨度>
      猜你喜欢
      • 2015-07-07
      • 1970-01-01
      • 2014-06-20
      • 2015-10-06
      • 2018-01-01
      • 1970-01-01
      • 2019-04-08
      • 2023-02-06
      相关资源
      最近更新 更多