1

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

由于您无法从 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 解决方案持开放态度。此外,我想知道其他数据库如何处理此类问题。

4

2 回答 2

3

这是我的最终解决方案:

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
于 2012-08-09T16:06:22.930 回答
2

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

@arg您可以像上面链接的答案中建议的那样创建一个函数,并从您的聚合中调用它,以防万一null

总体而言,它仍然是相同的策略,但我猜这比除以零更好。

于 2012-08-02T22:03:22.763 回答