我有一个标量SQL函数,它返回一个十进制值,并且此函数在我的数据库中的许多存储过程中使用。现在在一些程序中,我需要根据函数内的一些标准设置一个值。为了使它更清晰,根据用于计算函数结果的一些变量,我想在存储过程中设置另一个变量,并将其返回给客户端。从标量SQL函数返回两个值
我不想改变结果返回的方式或函数的返回类型。我正在考虑通过将我想要的新值插入到一个sql表中,然后从过程中读取它来做到这一点,但有没有其他更好的方法来做到这一点?
谢谢
我有一个标量SQL函数,它返回一个十进制值,并且此函数在我的数据库中的许多存储过程中使用。现在在一些程序中,我需要根据函数内的一些标准设置一个值。为了使它更清晰,根据用于计算函数结果的一些变量,我想在存储过程中设置另一个变量,并将其返回给客户端。从标量SQL函数返回两个值
我不想改变结果返回的方式或函数的返回类型。我正在考虑通过将我想要的新值插入到一个sql表中,然后从过程中读取它来做到这一点,但有没有其他更好的方法来做到这一点?
谢谢
你有几个选项
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)
不,你不能。 SQL Server中的函数受到严重限制,不允许有任何副作用。
但是,您可以做的是将标量函数转换为表函数。在它中,您可以根据需要返回一个包含多个列的表,因此返回多个值不是问题。
谢谢,我发现有不是改变功能的表值函数,没有别的办法,因为你不能在一个函数中做任何插入或更新。 – 2014-09-01 07:09:11