从标量SQL函数返回两个值

时间:2014-08-29 08:03:14

标签: sql sql-server sql-server-2008 tsql

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

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

由于

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

你有几个选择

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)

答案 2 :(得分:0)

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