【问题标题】:Return two values from a scalar SQL Function从标量 SQL 函数返回两个值
【发布时间】:2014-08-29 08:03:13
【问题描述】:

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

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

谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      你有几个选择

      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)
      

      【讨论】:

      • 谢谢,我发现除了将函数更改为表值函数之外别无他法,因为您无法在函数内进行任何插入或更新。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-26
        • 2011-04-18
        • 1970-01-01
        • 2020-03-19
        • 2014-06-20
        • 2010-09-21
        相关资源
        最近更新 更多