sp_msforeachdbは、舞台裏でどのように正確に機能しますか?


9

発生している問題をトラブルシューティングする必要があります。また、問題を解決するためにsp_msforeachdbがどのように機能するかを理解するための支援が必要です。

sp_msforeachdbを実行するたびにエラーが発生する Msg 102, Level 15, State 1, Incorrect syntax near '61'

私のコードの例は次のとおりです:

EXEC SP_msforeachdb 'SELECT ''?'' AS Database
                     FROM ?.sys.objects
                     WHERE name like ''%aetna%''

ただし、sp_msforeachdbのパラメーターとしてどのクエリを使用してもかまいません。同じエラーが発生するたびに。「61s1d」で始まるデータベースがあるので、DB名に問題があると思いますが、sp_msforeachdbの背後で何が起こっているのか、正直にわかりません。

注意事項。

  • 数字で始まる唯一のデータベース
  • 「データベースが '%61%'のようなものではありません……」のようなコードを使用することはできますが、それでも同じエラーが発生します。
  • データベース名の変更をテストすることはできません-接続しているものが多すぎます。
  • 「51」で始まるテストデータベースを作成すると、そのデータベースのエラーも表示されます

どうすればこれを克服できますか?

回答:


16

まず、sp_msforeachdbを使用しないでください。既知の問題がいくつかあります。Aaron Bertrandのバージョンを使用するほうがよいでしょう。

ただし、カーソル、動的SQL、および置換を使用します。実際には、sp_helptextを使用してコードを確認できます。

EXEC sp_helptext sp_msforeachdb

このコードを使用すると、いくつかの問題が修正されます。

EXEC SP_msforeachdb 'SELECT ''?'' AS Database
                 FROM [?].sys.objects
                 WHERE name like ''%aetna%''

括弧は、あなたが言及した特定の問題になります。ただし、[または]が含まれているデータベースがある場合は、問題が発生します。


興味深いのは、「?」を角括弧で囲んでいることです。から仕事をしました。Aaron Bertrandのバージョンを調べます。カーソルが原因でパフォーマンスが大幅に低下していることに気づきましたか?
Jeff.Clark 2016

2
カーソルは、行数が多い場合にのみ実際のパフォーマンスの問題になります。許可されているデータベースの最大数に近づかない限り、問題は発生しません。問題は、データベースをスキップできることです。アーロンの記事を読んで、彼はより詳細に行きます。
ケネスフィッシャー

1
複数回にわたってDBを完全にスキップすることを確認しました。Aaronを使用すると、はるかに信頼性が高くなります。
Kris Gruttemeyer 2016

11

@Kennethの発言に異論はありませんが、発生しているエラーはとは無関係であることを指摘しておきますsp_MSForEachDB。これは、データベースの命名方法が原因です。番号で始まります。(データベースだけでなく)オブジェクトの命名規則については、MSDNページの「データベース識別子」で詳しく説明しています。「通常の識別子の規則」に従う場合、それらの名前を角括弧または二重引用符で囲む必要ありません。しかし、それらのルールから外れる名前がない(常に)同封する必要があります。


1
この情報もありがとうございます-その制限を知りませんでした。残念ながら、このデータベースは私が入社する10年前に作成されました:)
Jeff.Clark

@ Jeff.Clark変更できないという質問で述べたように、DBの名前を変更するように勧めていませんでした。データベース名をどこにでも指定する必要があるときはいつでも再び現れるので、私はあなた(そして他の人)に実際の問題を知ってほしかった。そして、その完全なルールセットを読むことで、名前を必要とする他のこと(データベース、テーブル、列、インデックス、制約など)を常に角かっこまたは二重引用符で囲む必要がなくなります。
ソロモンルツキー2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.