在sql中的聚合函数中捕获空警告

时间:2012-12-19 13:19:06

标签: sql sql-server-2008

如何使用sql 2008/2012中的调试器来捕获记录中的空值?

请参阅:

drop table abc

create table abc(
a  int
)
go 
insert into abc values(1)
insert into abc values(null)
insert into abc values(2)

select max(a) from abc

(1 row(s) affected)
Warning: Null value is eliminated by an aggregate or other SET operation.

现在可以通过以下方式解决这个问题:

SELECT max(isNull(a,0)) FROM abc

这很好,直到我进入具有多个嵌套级别的200行查询,以及2000个奇数记录的结果集。 - 然后不知道哪一列发出警告。

如何在SQL调试器中添加条件断点(或中断警告)? (如果可能的话)

5 个答案:

答案 0 :(得分:3)

第1部分:关于汇总警告......
考虑到你的几个级别嵌套,我担心没有直接的方法来查看哪些记录触发了这些警告。

我认为你最好的方法是从顶级语句的SELECT部分​​一次删除每个聚合函数,然后运行查询,这样你就可以看到哪个聚合在顶层引发了警告(如果有的话) )

之后,您应继续进行嵌套查询,并将提供顶级聚合的每个子查询移动到单独的窗口并在那里运行,检查警告。您应该重复此操作以获得更多嵌套级别,以找出实际导致警告的原因。

您也可以使用以下方法。

第2部分:关于条件断点...
为了调试,您可以移动每个嵌套表并将其数据放入临时表。之后,检查该临时表中的空值。您在IF语句中设置断点。我相信这是接近条件断点的最好的东西。 (可以修改IF子句以构建其他条件)

这是一个坚实的例子,
而不是:

SELECT A.col1, A.col2, SUM(A.col3) as col3
FROM (SELECT X as col1, Y as col2, MAX(Z) as col3 
      FROM (SELECT A as X, B as Y, MIN(C) as Z
            FROM myTableC
           ) as myTableB
     ) as myTableA

这样做:

SELECT A as X, B as Y, MIN(C) as Z
INTO #tempTableC
FROM myTableC

IF EXISTS (SELECT * 
           FROM #tempTableC
           WHERE A IS NULL ) BEGIN
     SELECT 'A' --- Breakpoint here
END


SELECT X as col1, Y as col2, MAX(Z) as col3
INTO #tempTableB
FROM #tempTableC

IF EXISTS (SELECT *  
           FROM #tempTableB
           WHERE X IS NULL ) BEGIN
     SELECT 'B' --- Breakpoint here
END

SELECT col1, col2, SUM(col3) as col3 
FROM #tempTableB as myTableA

答案 1 :(得分:2)

聚合函数按定义排除空值,因此您只需编写

即可
select max (a) from abc

而不是

SELECT max(isNull(a,0)) FROM abc

除非abc中的a的所有值都为null,否则第二个查询将返回零而不是null。

如果要阻止输入空值,请在表列上使用非空约束。

答案 2 :(得分:1)

您可以执行以下命令关闭警告:

set ansi_warnings off

这解释为here。这至少在我测试过的系统上有效,可以在聚合NULL值时删除警告。

这应该会对转换数字溢出并将0除以NULL而不是错误产生另一种影响。但是,我仍然得到除以0和算术溢出的错误。

另外,在使用SQL Server Management Studio时,很少会看到此消息。查询成功后,消息将显示在“消息”选项卡上。但是,SSMS默认为“结果”选项卡,通常没有理由查看消息(尽管警告在那里)。您只在查询中出现错误时自动看到警告,SSMS默认为消息选项卡。

答案 3 :(得分:0)

您必须编写第二个查询来提取您正在查找的数据。

SELECT * FROM abc WHERE a IS NULL

您可以将其放入IF语句中以编写错误消息,或者记录到表中。除此之外,你运气不好。抱歉。 :/

答案 4 :(得分:0)

相反,您可以忽略具有空值的行

SELECT MAX(a) FROM abc WHERE a IS NOT NULL