我希望在我的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解决方案持开放态度。另外,我想知道其他数据库如何处理这类问题。
答案 0 :(得分:2)
也许这个会有所帮助: https://stackoverflow.com/a/4681815/1371070
您可以创建一个类似上面链接的答案中建议的功能,并在@arg
为null
的情况下从您的汇总中调用。
总体而言,这仍然是相同的策略,但我认为这是一个比零除零更好的错误。
答案 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