从SQL Server函数返回多个值

57

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


2
也许你可以控制你的函数,使其返回一个带有分隔符的字符串,例如"result1|result2|result3"。 - Miguel Zavala
5个回答

46

将其更改为表值函数。

请参考以下链接,例如。


这个例子很棒,谢谢提供链接。有没有办法从多个表中返回行呢?我想要的是从表A返回1行,从表B返回1行...以此类推。 - Jose Manuel Ojeda

17

4
@Fernando68:那又怎样?在T-SQL中,函数和存储过程非常相似。根据OP使用函数的位置,可能可以将其转换为存储过程。如果是这样的话,那么这个问题就是xy问题 的一个例子,这个答案对于实际问题会有用。 - Cameron Lee

10

这是一个内联函数的查询分析器模板 - 默认情况下,它返回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  

9
Erland Sommarskog在这里详细介绍了有关在SQL Server中传递数据的内容:http://www.sommarskog.se/share_data.html。他涵盖了SQL Server 2000、2005和2008,并且应该全面阅读,因为每种方法的优缺点都有充分的覆盖。然而,以下是文章的要点(截至2015年7月)供搜索使用:
本文解决了两个相关问题:
  • 如何在另一个存储过程中使用一个存储过程的结果集,也可以表示为如何在SELECT语句中使用存储过程的结果集?
  • 如何从一个存储过程向另一个存储过程传递表格数据?
输出参数
  • 通常不适用,但有时被忽视。
表值函数
  • 通常是仅输出的最佳选择,但有几个限制。
  • 示例:
    • 内联函数:使用此功能重用单个SELECT。
    • 多语句函数:当您需要封装更复杂的逻辑时。
使用表格
  • 最通用的解决方案。我喜欢用于输入/输出场景。
  • 示例:
    • 共享临时表:主要用于单个调用方/被调用方。
    • 处理键入表格:许多调用者到同一被调用方的最佳选择。
    • 全局临时表:处理键入表格的变体。
表值参数
  • 需求版本:SQL 2008
  • 主要用于从客户端传递数据时。
INSERT-EXEC
  • 看似吸引人,但应谨慎使用。
使用CLR
  • 需求版本:SQL 2005
  • 复杂,但在INSERT-EXEC无法工作时非常有用。
OPENQUERY
  • 有许多陷阱的棘手问题。不鼓励使用。
使用XML
  • 需求版本:SQL 2005
  • 有点笨拙,但不是没有优点。
使用游标变量
  • 不推荐使用。

2

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

正如用户 Mr. Brownstone 建议的那样,您可以使用{{link1:存储过程}};为了方便起见,我创建了一个最简示例。首先{{link2:创建一个存储过程}}:

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 

调用存储过程

执行存储过程,需要几个本地变量来接收值:

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 

这将是结果:

Result of Stored Procedure Call with multiple out parameters


5
很抱歉,但是问题与函数有关,而不是存储过程,似乎唯一回答这个问题的方法是使用表值函数,正如上面所解释的那样。 - Fandango68

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