Come funziona esattamente sp_msforeachdb dietro le quinte?


9

Devo risolvere un problema che sto riscontrando e ho bisogno di aiuto per capire come funziona sp_msforeachdb al fine di superare il mio problema.

Quello che succede è ogni volta che eseguo sp_msforeachdb, ricevo un errore Msg 102, Level 15, State 1, Incorrect syntax near '61'

Un esempio del mio codice è il seguente:

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

Tuttavia, non importa quale query ho come parametro per sp_msforeachdb. Ogni volta che ottengo lo stesso errore. Ho un database che inizia con '61s1d', quindi questo mi fa pensare che abbia un problema con il nome DB, ma onestamente non so cosa sta succedendo dietro le quinte su sp_msforeachdb.

Cose da notare

  • È l'unico database che inizia con un numero
  • Posso provare a usare un codice come "Se il database è come '% 61%' non farlo ......", ma rimane sempre lo stesso errore.
  • Non riesco a provare a cambiare il nome del database - troppe cose ad esso collegate.
  • Se creo un db di prova che inizia con '51', ottengo anche l'errore per quel database

Come posso superare questo?

Risposte:


16

Prima di tutto non usare sp_msforeachdb ha diversi problemi noti. Stai meglio usando la versione di Aaron Bertrand .

Tuttavia utilizza un cursore, SQL dinamico e un sostituto. Puoi effettivamente guardare il codice usando sp_helptext.

EXEC sp_helptext sp_msforeachdb

Se usi questo codice risolverà alcuni dei tuoi problemi.

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

Le parentesi saranno il problema specifico che hai citato. Incontrerai comunque dei problemi se hai un database con [o] al suo interno.


Interessante, usando le parentesi intorno al "?" nel da ha funzionato. Esaminerò la versione di Aaron Bertrand. Hai notato un degrado significativo delle prestazioni a causa del cursore?
Jeff.Clark,

2
I cursori sono un vero problema di prestazioni quando si hanno più righe. A meno che non ti stavi avvicinando al numero massimo di database consentiti, non vedresti un problema. Il problema è che può saltare i database. Leggi l'articolo di Aaron e approfondisce i dettagli.
Kenneth Fisher,

1
L'ho visto saltare completamente i DB in più di un'occasione. Usa Aaron's, è molto più affidabile.
Kris Gruttemeyer,

11

Non essendo in disaccordo con nulla di ciò che ha detto @Kenneth, dovrei sottolineare che l'errore che stai riscontrando non ha nulla a che fare sp_MSForEachDB. È dovuto al nome del database: inizia con un numero. Le regole per la denominazione degli oggetti (non solo dei database) sono dettagliate nella pagina MSDN per gli identificatori di database . Se segui le "Regole per identificatori regolari", non è necessario racchiudere questi nomi tra parentesi quadre o virgolette doppie. Ma i nomi che non rientrano di tali norme non hanno bisogno di essere allegata (sempre).


1
Grazie anche per queste informazioni - non ero a conoscenza di tale limitazione. Sfortunatamente quel database è stato creato un decennio prima di entrare a far parte dell'azienda :)
Jeff.Clark,

@ Jeff.Clark Non stavo suggerendo di rinominare il DB come hai detto nella domanda che non puoi cambiarlo. Volevo solo che tu (e altri) venissi a conoscenza del problema reale poiché si presenterà di nuovo ogni volta che è necessario specificare il nome del database ovunque. E la lettura di quel set completo di regole può aiutarti a evitare le altre cose che richiederanno un nome - Database, Tabella, Colonna, Indice, Vincolo, ecc. - Da racchiudere sempre tra parentesi quadre o virgolette doppie.
Solomon Rutzky,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.