从标量SQL函数返回两个值



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

我不想改变结果的返回方式或函数的返回类型。我想把我想要的新值插入一个sql表中,然后从过程中读取,但有其他更好的方法吗?

感谢

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

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

您有几个选项

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)

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

最新更新