从标量 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 函数返回两个值的主要内容,如果未能解决你的问题,请参考以下文章