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

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

最佳答案

第 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

关于sql - 在 sql 中的聚合函数中捕获空警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13953307/

相关文章:

php - Mysql alter table 添加重复名称错误

php - 错误: could not find driver - Using PDO with MS Access database

mysql - SQL查询给出下面提到的错误

c# - 保存 LINQ-To-SQL 实体时出现 "Specified cast is not valid"错误

时间:2019-03-17 标签:c#SQLCOMMAND给出错误

sql-server-2008 - 我在 sql server 2008 中的全文索引选项是灰色的?

mysql - 查找表中的下一条记录。在约会时间之后。查询

sql - 在单个 SQL 查询中插入多行?

SQL 选择值 = 'X' 或最小值

SQL 更改表查询卡在执行中