从SQL Server函数返回多个值

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

使它成为一个表值函数

看到这里http://technet.microsoft.com/en-us/library/ms191165.aspx ,包括的例子

另一个select是使用输出参数的过程 – 使用具有输出参数的存储过程

Erland Sommarskog详细介绍了SQL Server中传递数据的位置:

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

他涵盖了SQL Server 2000,2005和2008,可能应该详细阅读每个方法的优点和缺点。 不过,为了提供可用于查看更多详细信息的search字词,本文的重点(截至2015年7月截止)

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

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

输出参数

  • 通常不适用,但有时会被忽视。

表值函数

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

使用表

  • 最一般的解决scheme。 我喜欢的input/输出scheme的select。
  • 例子:
    • 共享临时表:主要用于一对调用者/被调用者。
    • 进程键表:对于同一被调用者来说,许多调用者的最佳select。
    • 全局临时表:一个过程键的变体。

表值参数

  • 所需物品。 版本:SQL 2008
  • 主要用于从客户端传递数据。

INSERT-EXEC

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

使用CLR

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

OPENQUERY

  • 棘手与许多陷阱。 灰心。

使用XML

  • 所需物品。 版本:SQL 2005
  • 有点混乱,但不是没有优势。

使用游标variables

  • 不值得推荐。

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

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

正如用户Mr. Brownstonebuild议您可以使用存储过程 ; 为了方便我创build了一个简约的例子。 首先创build一个存储过程 :

 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 

调用存储过程

要执行存储过程,需要几个局部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 

这将是结果:

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