在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奇数记录. – 然后不知道哪一列抛出警告.
解决方法
第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,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,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