52

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

4

5 回答 5

41

将其更改为表值函数

例如,请参考以下链接

于 2008-11-10T20:19:12.040 回答
17

另一种选择是使用带有输出参数的过程 -使用带有输出参数的存储过程

于 2008-11-10T20:22:01.283 回答
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  
于 2008-11-10T20:32:03.933 回答
9

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

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

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

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

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

输出参数

  • 不普遍适用,但有时被忽视。

表值函数

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

使用表格

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

表值参数

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

插入执行

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

使用 CLR

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

公开查询

  • 很棘手,有很多陷阱。灰心。

使用 XML

  • 请求。版本:SQL 2005
  • 有点杂乱无章,但并非没有优势。

使用光标变量

  • 不推荐。
于 2012-01-27T00:25:51.320 回答
1

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

正如用户Mr. Brownstone建议的那样,您可以使用存储过程;为了方便所有人,我创建了一个极简主义示例。首先创建一个存储过程

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 

这将是结果:

具有多个输出参数的存储过程调用的结果

于 2013-04-02T18:09:07.517 回答