2014-08-29 172 views
0

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

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

谢谢

回答

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) 
+0

谢谢,我发现有不是改变功能的表值函数,没有别的办法,因为你不能在一个函数中做任何插入或更新。 – 2014-09-01 07:09:11

2

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

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