14

SQL 2008/2012のデバッガーを使用して、レコード内のnull値をキャッチするにはどうすればよいですか?

見る:

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

which is fine, until I come to to 200 line queries with several levels of nesting,and a result set of 2000 odd records. -- And then have no clue which column is throwing the warning.

How do I add conditional breakpoints ( or break on warning ) in the SQL debugger? ( if it is even possible )

4

5 に答える 5

3

パート1:集約警告について...
ネストしているいくつかのレベルを考慮すると、どのレコードがそれらの警告をトリガーするかを簡単に確認する方法はありません。

ベストショットは、トップレベルステートメントのSELECT部分​​から各集計関数を一度に1つずつ削除し、クエリを実行して、トップレベルで警告を引き起こしている集計を確認することです(存在する場合)。

その後、ネストされたクエリに移動し、最上位の集計を別のウィンドウにフィードする各サブクエリを移動してそこで実行し、警告を確認する必要があります。ネストの追加レベルについてこれを繰り返して、実際に警告の原因を見つける必要があります。

以下の方法も使用できます。

パート2:条件付きブレークポイントについて...
デバッグのために、ネストされた各テーブルを移動し、そのデータを一時テーブルに配置します。その後、その一時テーブルでnull値をチェックします。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

集計関数は定義により null 値を除外するため、次のように記述できます。

select max (a) from abc

それ以外の

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

abc の a のすべての値が null でない限り、2 番目のクエリは null ではなくゼロを返します。

NULL 値が入力されないようにする場合は、表の列に非 NULL 制約を使用してください。

于 2012-12-19T13:43:40.093 に答える
1

次のコマンドを実行して、警告をオフにすることができます。

set ansi_warnings off

これについては、こちらで説明しています。これは、少なくとも私がテストしたシステムでは機能し、NULL 値で集計するときの警告を削除します。

これは、エラーではなく、数値のオーバーフローと 0 による除算を NULL に変換する別の効果があると思われます。ただし、0 による除算と算術オーバーフローのエラーが引き続き発生します。

余談ですが、SQL Server Management Studio を使用している場合、このメッセージが表示されることはめったにありません。クエリが成功すると、メッセージが [メッセージ] タブに表示されます。ただし、SSMS は既定で [結果] タブに設定されており、通常、メッセージを確認する必要はありません (警告は表示されます)。クエリにエラーがある場合にのみ自動的に警告が表示され、SSMS はデフォルトで [メッセージ] タブに表示されます。

于 2012-12-26T17:06:07.190 に答える
0

むしろ、null 値を持つ行を無視することができます

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

探しているデータを引き出すには、2 つ目のクエリを作成する必要があります。

SELECT * FROM abc WHERE a IS NULL

これを IF ステートメントに入れて、エラー メッセージを書き込んだり、テーブルにログを記録したりできます。それ以外は、あなたは運が悪いです。ごめん。: /

于 2012-12-19T14:12:29.180 に答える