我有一个Scalar SQL函数,它返回一个十进制值,并且该函数在我的数据库中的许多存储过程中使用。现在在一些程序中,我需要根据函数内部的一些标准设置一个值。为了更清楚,根据计算函数结果时使用的一些变量,我想在Stored过程中设置另一个变量,并将其返回给客户端。
我不想改变返回结果的方式或函数的返回类型。我想通过将我想要的新值插入到sql表中然后从过程中读取它来实现它,但是还有其他更好的方法吗?
由于
答案 0 :(得分:2)
但是,您可以将标量函数转换为表函数。在其中,您可以返回一个包含所需列数的表,因此返回多个值不是问题。
答案 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)历史数据库(如医疗信息)非常有用。通常用于将字段连接到最终用户友好的“句子”中,以处理可能具有零至许多值的数据,例如患者诊断。在过滤后的数据上应用表值功能,这非常有效。