TSQL函数如果传递null将会出现raiserror?

时间:2012-08-02 21:27:31

标签: sql sql-server database tsql

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

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

2 个答案:

答案 0 :(得分:2)

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

您可以创建一个类似上面链接的答案中建议的功能,并在@argnull的情况下从您的汇总中调用。

总体而言,这仍然是相同的策略,但我认为这是一个比零除零更好的错误。

答案 1 :(得分: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