从标量 SQL 函数返回两个值

Posted

技术标签:

【中文标题】从标量 SQL 函数返回两个值【英文标题】:Return two values from a scalar SQL Function 【发布时间】:2014-08-29 08:03:13 【问题描述】:

我有一个返回十进制值的标量 SQL 函数,该函数用于我数据库中的许多存储过程。现在在一些程序中,我需要根据函数内部的一些标准设置一个值。为了更清楚,根据计算函数结果时使用的一些变量,我想在存储过程中设置另一个变量,并将其返回给客户端。

我不想更改返回结果的方式或函数的返回类型。我正在考虑通过将我想要的新值插入到 sql 表中然后从过程中读取它来做到这一点,但是还有其他或更好的方法吗?

谢谢

【问题讨论】:

【参考方案1】:

不,你不能。 SQL Server 中的函数受到严格限制,不允许有任何副作用。

但是,您可以将标量函数转换为表函数。在其中,您可以根据需要返回包含任意多列的表,因此返回多个值不是问题。

【讨论】:

【参考方案2】:

你有几个选择

1) 将其从函数改为存储过程,并添加输出参数。

2) 将其从标量函数更改为返回单行的表值函数,附加值作为附加列。

如果您需要保留现有函数签名,则只需创建一个新的表值函数来完成工作(根据上面的选项 2),然后修改现有函数以从新的表值函数中进行选择。

以下是一些示例代码:

-- the original scalar function
CREATE FUNCTION dbo.t1(@param1 INT)
RETURNS INT AS
BEGIN
    RETURN @param1 + 1
END
GO

-- a new table valued function, that returns 2 values in a single row
CREATE FUNCTION dbo.t2(@param1 INT)
RETURNS TABLE AS
    RETURN (SELECT @param1 + 1 AS [r1], @param1 + 2 AS [r2])
GO

-- the modified original function, now selecting from the new table valued function
CREATE FUNCTION dbo.t3(@param1 INT)
RETURNS INT AS
BEGIN
    RETURN (SELECT r1 FROM dbo.t2(@param1))
END
GO

-- example usage
SELECT dbo.t1(1)
SELECT * FROM dbo.t2(1)
SELECT dbo.t3(1)

【讨论】:

谢谢,我发现除了将函数更改为表值函数之外别无他法,因为您无法在函数内进行任何插入或更新。【参考方案3】:

返回单行的表值函数是我最喜欢的技术,当来自标量函数的单个答案不够充分(或查询速度太慢)时。一个表可以有零到多行。一旦我意识到“表”值函数可以限制为只返回一行,很明显可以在单个表值函数中完成需要单独标量函数的多个问题。这就像类固醇上的标量函数。我喜欢将所有需要的数据一次读入一个内部表变量,然后根据需要操作该数据,将其分配给其他变量,最后组装一条记录的输出“表”的答案。我的数据库环境是只读的,不是基于事务的。对于像医疗信息这样的大型(Mult-TB)历史数据库非常有用。经常用于将字段连接成最终用户友好的“句子”,以处理可能具有零到多个值的数据,例如患者诊断。 Outer 对过滤后的数据应用表值函数,效率极高。

【讨论】:

以上是关于从标量 SQL 函数返回两个值的主要内容,如果未能解决你的问题,请参考以下文章

如何在sql服务中将列名分配给标量函数的返回值

T-SQL编程 —— 用户自定义函数(标量函数)

从 sql 程序调用用户定义的标量函数

SQL 自定义函数(Function)——参数默认值

SQL Server 自定义函数(Function)——参数默认值

SQL Server 自定义函数