【发布时间】:2010-09-21 16:43:50
【问题描述】:
如何从 SQL Server 中的用户定义函数返回多个值(例如,一个数字和一个字符串)?
【问题讨论】:
-
也许你可以控制你的函数,让它返回一个带有一些分隔符的字符串,比如“result1|result2|result3”
标签: tsql user-defined-functions
如何从 SQL Server 中的用户定义函数返回多个值(例如,一个数字和一个字符串)?
【问题讨论】:
标签: tsql user-defined-functions
改成表值函数
例如请参考以下link。
【讨论】:
另一种选择是使用带有输出参数的过程 - Using a Stored Procedure with Output Parameters
【讨论】:
这是内联函数的查询分析器模板 - 默认情况下它返回 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
【讨论】:
Erland Sommarskog 有一篇关于在 SQL Server 中传递数据的详尽文章,位于此处:
http://www.sommarskog.se/share_data.html
他介绍了 SQL Server 2000、2005 和 2008,可能应该详细阅读它,因为对每种方法的优缺点都有充分的介绍。但是,为了提供可用于查看更多详细信息的搜索词,这里是文章的重点(截至 2015 年 7 月冻结):
本文解决了两个相关问题:
- 如何在另一个存储过程中使用结果集,也表示为如何使用存储过程中的结果集
SELECT 语句中的过程?- 如何将参数中的表数据从一个存储过程传递到另一个存储过程?
输出参数
- 一般不适用,但有时会被忽视。
表值函数
- 通常是仅输出的最佳选择,但有一些限制。
- 示例:
- 内联函数:使用它来重用单个 SELECT。
- 多语句函数:当您需要封装更复杂的逻辑时。
使用表格
- 最通用的解决方案。我最喜欢的输入/输出场景。
- 示例:
- 共享临时表:主要用于一对调用者/被调用者。
- 进程键控表:同一被调用者的多个调用者的最佳选择。
- 全局温度表:进程键控的变体。
表值参数
- 请求。版本:SQL 2008
- 主要在从客户端传递数据时有用。
插入执行
- 具有欺骗性的吸引力,但应谨慎使用。
使用 CLR
- 请求。版本:SQL 2005
- 复杂,但在 INSERT-EXEC 不起作用时作为最后的手段很有用。
打开查询
- 很棘手,有很多陷阱。气馁。
使用 XML
- 请求。版本:SQL 2005
- 有点笨拙,但并非没有优势。
使用游标变量
- 不推荐。
【讨论】:
作为用户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
这将是结果:
【讨论】: