微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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调试器中添加条件断点(或者打破警告)? (如果是可能的话)

解决方法

第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

原文地址:https://www.jb51.cc/mssql/81923.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐