Ale*_*lex 14 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.
Run Code Online (Sandbox Code Playgroud)
现在可以通过以下方式纠正:
SELECT max(isNull(a,0)) FROM abc
Run Code Online (Sandbox Code Playgroud)
这很好,直到我进行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
Run Code Online (Sandbox Code Playgroud)
做这个:
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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6604 次 |
最近记录: |