从SQL Server函数返回多个值

Jer*_*ein 44 t-sql user-defined-functions

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

dev*_*vio 35

使它成为一个表值函数

请参阅http://technet.microsoft.com/en-us/library/ms191165.aspx,其中包含示例


Roc*_*der 16

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

  • @ Fernando68:那么?函数和存储过程在T-SQL中非常相似.根据OP使用该功能的位置,可以将其转换为存储过程.如果是这样,那么这个问题将是[xy问题]的一个例子(http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem),这个答案对于实际问题是有用的手. (4认同)

for*_*reh 10

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

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

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

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

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

输出参数

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

表值函数

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

使用表格

  • 最通用的解决方案.我最喜欢的输入/输出场景选择.
  • 例子:
    • 共享临时表:主要用于一对呼叫者/被呼叫者.
    • 进程密钥表:同一被调用者的许多呼叫者的最佳选择.
    • 全局临时表:流程键的变体.

表值参数

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

INSERT-EXEC

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

使用CLR

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

OPENQUERY

  • 有许多陷阱的棘手.泄气.

使用XML

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

使用光标变量

  • 不值得推荐.


dkr*_*etz 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  
Run Code Online (Sandbox Code Playgroud)