【问题标题】:TSQL function which will raiserror if passed null?如果传递null,TSQL函数会引发错误?
【发布时间】:2012-07-31 22:21:23
【问题描述】:

我希望在我的 TSQL 库中添加一些代码,以防止在列中的数据为空时在 SQL 中执行聚合。理想情况下,在 sql server 中会有一个 SUM_NN(对于 sum 不为空),如果任何值为空,则会引发错误。

由于您无法从 UDF 中引发错误,因此我能想到的唯一方法看起来像这样,尽管我不喜欢这种解决方案:

CREATE FUNCTION dbo.NULL_TEST_F(@arg FLOAT)
RETURNS FLOAT
AS
BEGIN
    IF(@arg IS NULL)
        SELECT 1/0
    RETURN @arg
END

注意:我认为这是一个愚蠢的解决方案,但是当我丢失数据时,我已经被烧毁了太多次。此外,我们使用的是 SQL Server 2005,但我对 2008 和 2012 解决方案持开放态度。另外,我想知道其他数据库如何处理此类问题。

【问题讨论】:

  • 为什么在NULL的情况下需要抛出异常?它如何帮助聚合?

标签: sql sql-server database tsql


【解决方案1】:

也许这个会有所帮助: https://stackoverflow.com/a/4681815/1371070

如果@argnull,您可以像上面链接的答案中建议的那样创建一个函数并从您的聚合中调用它。

总的来说,它仍然是相同的策略,但我猜这比被零除更好。

【讨论】:

    【解决方案2】:

    这是我的最终解决方案:

    CREATE FUNCTION [dbo].[NullTest_F]
    (
        @input FLOAT,
        @message VARCHAR(100)
    )
    RETURNS FLOAT
    AS
    BEGIN
        DECLARE @test INT
        IF(@input IS NULL)
            SELECT @test = CAST(@message AS INT)
        RETURN @input
    END
    

    然后我可以在运行聚合函数时将其嵌入一个有用的错误消息。示例:

    CREATE TABLE Data (
        Date DATETIME,
        DataPoint FLOAT
    )
    
    INSERT INTO Data (Date, DataPoint) VALUES ('2012-03-01', 4)
    INSERT INTO Data (Date, DataPoint) VALUES ('2012-03-02', 6)
    
    SELECT SUM(NullTest_F(DataPoint, 'Missing data at' + CONVERT(VARCHAR(10), Data))
    FROM Data
    

    【讨论】:

      猜你喜欢
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多