Wie genau funktioniert sp_msforeachdb hinter den Kulissen?


9

Ich muss ein Problem beheben, das ich habe, und ich brauche Hilfe, um zu verstehen, wie sp_msforeachdb funktioniert, um mein Problem zu beheben.

Jedes Mal, wenn ich sp_msforeachdb ausführe, wird eine Fehlermeldung angezeigt Msg 102, Level 15, State 1, Incorrect syntax near '61'

Ein Beispiel für meinen Code lautet wie folgt:

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

Es spielt jedoch keine Rolle, welche Abfrage ich als Parameter für sp_msforeachdb habe. Jedes Mal bekomme ich den gleichen Fehler. Ich habe eine Datenbank, die mit '61s1d' beginnt, sodass ich denke, dass es ein Problem mit dem DB-Namen gibt, aber ich weiß ehrlich gesagt nicht, was sich hinter den Kulissen von sp_msforeachdb abspielt.

Dinge zu beachten.

  • Es ist die einzige Datenbank, die mit einer Nummer beginnt
  • Ich kann versuchen, Code wie "Wenn die Datenbank '% 61%' ist, nicht tun ......" zu verwenden, aber immer noch den gleichen Fehler.
  • Ich kann das Ändern des Datenbanknamens nicht testen - zu viele damit verbundene Dinge.
  • Wenn ich eine Testdatenbank erstelle, die mit '51' beginnt, wird auch der Fehler für diese Datenbank angezeigt

Wie kann ich das überwinden?

Antworten:


15

Verwenden Sie zunächst nicht sp_msforeachdb, da mehrere Probleme bekannt sind. Sie sind besser dran, wenn Sie die Version von Aaron Bertrand verwenden .

Es werden jedoch ein Cursor, dynamisches SQL und ein Ersetzen verwendet. Sie können den Code mithilfe von sp_helptext anzeigen.

EXEC sp_helptext sp_msforeachdb

Wenn Sie diesen Code verwenden, werden einige Ihrer Probleme behoben.

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

Die Klammern entsprechen dem von Ihnen erwähnten spezifischen Problem. Sie werden jedoch auf Probleme stoßen, wenn Sie eine Datenbank mit [oder] haben.


Interessant, mit Klammern um das "?" in der von hat funktioniert. Ich werde Aaron Bertrands Version untersuchen. Haben Sie aufgrund des Cursors einen signifikanten Leistungsabfall festgestellt?
Jeff.Clark

2
Cursor sind nur dann ein echtes Leistungsproblem, wenn Sie mehr als ein paar Zeilen haben. Wenn Sie sich nicht der maximal zulässigen Anzahl von Datenbanken nähern, wird kein Problem angezeigt. Das Problem ist, dass es Datenbanken überspringen kann. Lesen Sie Aarons Artikel und er geht näher darauf ein.
Kenneth Fisher

1
Ich habe gesehen, dass DBs mehr als einmal vollständig übersprungen wurden. Verwenden Sie Aarons, es ist viel zuverlässiger.
Kris Gruttemeyer

11

Da ich mit nichts, was @Kenneth gesagt hat, nicht einverstanden bin, sollte ich darauf hinweisen, dass der Fehler, auf den Sie stoßen, nichts damit zu tun hat sp_MSForEachDB. Es liegt daran, wie die Datenbank benannt wurde: Sie beginnt mit einer Nummer. Die Regeln zum Benennen von Objekten (nicht nur von Datenbanken) finden Sie auf der MSDN-Seite für Datenbankkennungen . Wenn Sie die "Regeln für reguläre Bezeichner" befolgen, müssen Sie diese Namen nicht in eckige Klammern oder doppelte Anführungszeichen setzen. Namen, die außerhalb dieser Regeln liegen , müssen jedoch (immer) beigefügt werden.


1
Vielen Dank auch für diese Informationen - ich war mir dieser Einschränkung nicht bewusst. Leider wurde diese Datenbank ein Jahrzehnt vor
meinem

@ Jeff.Clark Ich habe nicht vorgeschlagen, dass Sie die Datenbank umbenennen, wie Sie in der Frage erwähnt haben, dass Sie sie nicht ändern können. Ich wollte nur, dass Sie (und andere) das eigentliche Problem kennen, da es immer wieder auftritt, wenn Sie diesen Datenbanknamen irgendwo angeben müssen. Wenn Sie diese vollständigen Regeln durchlesen, können Sie die anderen Dinge vermeiden, für die ein Name - Datenbank, Tabelle, Spalte, Index, Einschränkung usw. - immer in eckigen Klammern oder doppelten Anführungszeichen stehen muss.
Solomon Rutzky
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.