从SQL Server函数返回多个值

时间:2008-11-10 20:17:09

标签: tsql user-defined-functions

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

5 个答案:

答案 0 :(得分:34)

使其成为表值函数

请参阅此处http://technet.microsoft.com/en-us/library/ms191165.aspx,示例包括

答案 1 :(得分:16)

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

答案 2 :(得分:9)

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

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

他涵盖了SQL Server 2000,2005和2008,并且应该详细阅读它,因为每种方法的优点和缺点都有充分的内容。但是,为了提供可用于查看更多详细信息的搜索术语,以下是本文的重点(截至2015年7月为时冻结):

  

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

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

输出参数

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

表值函数

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

使用表格

     
      
  • 最通用的解决方案。我最喜欢的输入/输出方案选择。
  •   
  • 实施例:      
        
    • 分享临时表:主要针对一对来电者/被叫者。
    •   
    • 流程密钥表:同一被呼叫者的多个呼叫者的最佳选择。
    •   
    • 全球临时表:流程键的变体。
    •   
  •   
     

表值参数

     
      
  • 所需物品。版本:SQL 2008
  •   
  • 从客户端传递数据时非常有用。
  •   
     

插入-EXEC

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

使用CLR

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

<强> OPENQUERY

     
      
  • 有许多陷阱的棘手。气馁。
  •   
     

使用XML

     
      
  • 所需物品。版本:SQL 2005
  •   
  • 有点像kludge,但并非没有优势。
  •   
     

使用光标变量

     
      
  • 不推荐。
  •   

答案 3 :(得分:8)

以下是内联函数的查询分析器模板 - 默认情况下返回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 :(得分:1)

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

正如用户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 

这将是结果:

Result of Stored Procedure Call with multiple out parameters