別の投稿者 (WolfiG) が非常によく似た質問をしているのを見ましたが、答えがわかりません。(私はエラー メッセージを理解していますが、エラーを修正する方法を探しているわけではありません。他のエラーに使用するエラー チェック (またはデバッグ手法) の種類があるかどうかを判断しようとしています。
サーバー上の各データベースの各テーブルを取得し、PK と行数を表示するために、同様のコードを見つけて追加しました。(インベントリとデータ ディクショナリに取り組んでいますが、これは問題ではありません。コードがどのようになったかを説明しているだけです。)
SO この場合、私はすでにデータをいくらか絞り込んでいました (つまり、どのデータベースをクエリしてエラーが発生したかを知っているということです)。ただし、もちろん、問題を見つけるには手動でチェックする必要がありすぎるため、サブクエリでエラーが発生したときにどの「t.name」が読み取られているかを確認する方法があることを望んでいました。(一度に 1 行ずつコメントアウトして、最初のサブクエリを絞り込みました (10 行あり、ここではすべてをコピーしませんでした。)
繰り返しになりますが、質問は (この種の質問をするのは私だけではないようです) - クエリでエラーが発生した行 (データ) を特定する方法はありますか?
以下の例で は、エラーが発生したときに t.name (または他の列のデータ) が最新であったことを表示する方法はありますか?
メインフレームで作業した後、ダンプまたはバッファを確認できます。しかし、システムには明らかに情報があるのに表示されない不可解なメッセージが表示され続けるので、あまり期待したくないと思います。
メッセージ 512、レベル 16、状態 1、行 1 サブクエリが複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後にある場合、またはサブクエリが式として使用されている場合、これは許可されません。
use [DBName]
SELECT '[DBName]' as DBName, t.NAME, it.xtype,i.rowcnt,
(select c.name from syscolumns c inner join sysindexkeys k on k.indid=i.indid and c.colid = k.colid and c.id=t.id and k.keyno=1 and k.id=t.id)as 'column1',
(select c.name from syscolumns c inner join sysindexkeys k on k.indid=i.indid and c.colid = k.colid and c.id=t.id and k.keyno=2 and k.id=t.id)as 'column2'
from sysobjects t inner join sysindexes i on i.id=t.id
LEFT OUTER JOIN sysobjects it on it.parent_obj=t.id and it.name = i.name
WHERE i.indid < 2 AND OBJECTPROPERTY(t.ID, 'IsMSShipped') = 0
ありがとう!
ちなみに、このエラーの原因となっている行を見つけることができた方法 (これが他の人に役立つ場合) は、最初のサブクエリを「syscolumns からcount(c.name)を選択する」に変更してから、数が > 1 の行。
Sebastian Meine ありがとうございます。しかし、別の問題にぶつかりました。(SQL は辞書の他の DB よりも優れているというあなたのコメントに、私はかなり悲しいことに異議を唱えていると言わざるを得ませんでした。GRRRR)
「i.indid < 2」を使用していたのは、最初は最初にrowcntを取得しようとしていて、正直なところすべてのサンプルがそれを使用していたからです。しかし、貼り付けたクエリがはるかに多くの行を取得し、元のクエリが欠落していることがわかります-明らかにチェックが原因です: i.indid < 2
ただし、クエリを使用すると、同じテーブルがさらに多く発生するようになり、これを入力しているときに /ARGHHH を「要約」する方法がわかり ません。 COLS は主キーだけでなく、同じテーブル名が表示されます(行数が異なり、多くの場合、テーブルのすべての列に行があったように見えますが、他の場合はそうではありません)。したがって、パターンを探していると、MAYBE sysindexes.status = が結果を制限する可能性があることがわかりましたが、それが近いうちに、まだ重複した行がありました。再びARGGGH