14

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

4

5 回答 5

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
于 2012-12-25T12:36:48.827 回答
2

聚合函数根据定义排除空值,因此您可以编写

select max (a) from abc

代替

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

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

如果要防止输入空值,请对表列使用非空约束。

于 2012-12-19T13:43:40.093 回答
1

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

set ansi_warnings off

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

据说这对将数字溢出和除以 0 转换为 NULL 而不是错误有另一个影响。但是,除以 0 和算术溢出时,我仍然会遇到错误。

顺便说一句,在使用 SQL Server Management Studio 时,很少会看到此消息。查询成功后,消息显示在“消息”选项卡上。但是,SSMS 默认为“结果”选项卡,通常没有理由查看消息(尽管存在警告)。只有在查询中出现错误时才会自动看到警告,并且 SSMS 默认为消息选项卡。

于 2012-12-26T17:06:07.190 回答
0

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

SELECT * FROM abc WHERE a IS NULL

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

于 2012-12-19T14:12:29.180 回答
0

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

SELECT MAX(a) FROM abc WHERE a IS NOT NULL
于 2012-12-27T10:49:55.607 回答