从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. Brownstone
build议您可以使用存储过程 ; 为了方便我创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
这将是结果: