¿Cómo funciona exactamente sp_msforeachdb detrás de escena?

9

Necesito solucionar un problema que tengo y necesito ayuda para entender cómo funciona sp_msforeachdb para solucionar mi problema.

Lo que sucede es que cada vez que ejecuto sp_msforeachdb, recibo un error Msg 102, Level 15, State 1, Incorrect syntax near '61'

Un ejemplo de mi código es el siguiente:

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

Sin embargo, no importa qué consulta tenga como parámetro para sp_msforeachdb. Cada vez me sale el mismo error. Tengo una base de datos que comienza con '61s1d', así que eso me hace pensar que tiene un problema con el nombre de la base de datos, pero honestamente no sé qué sucede detrás de escena en sp_msforeachdb.

Cosas a tener en cuenta.

  • Es la única base de datos que comienza con un número.
  • Puedo intentar usar código como "Si la base de datos es como '% 61%' no lo hagas ......", pero sigue siendo el mismo error.
  • No puedo probar cambiar el nombre de la base de datos, hay demasiadas cosas conectadas a ella.
  • Si creo una base de datos de prueba que comienza con '51', también aparece el error para esa base de datos

¿Cómo puedo superar esto?

Jeff.Clark
fuente

Respuestas:

16

En primer lugar, no use sp_msforeachdb, tiene varios problemas conocidos. Es mejor usar la versión de Aaron Bertrand .

Sin embargo, utiliza un cursor, SQL dinámico y un reemplazo. En realidad, puede mirar el código utilizando sp_helptext.

EXEC sp_helptext sp_msforeachdb

Si usa este código, solucionará algunos de sus problemas.

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

Los paréntesis serán el problema específico que mencionaste. Sin embargo, tendrá problemas si tiene una base de datos con [o] en ella.

Kenneth Fisher
fuente
Interesante, usando corchetes alrededor del "?" en el trabajo hecho. Examinaré la versión de Aaron Bertrand. ¿Has notado una degradación significativa del rendimiento debido al cursor?
Jeff.Clark
2
Los cursores son solo un problema de rendimiento real cuando tiene más de unas pocas filas. A menos que se acercara al número máximo de bases de datos permitidas, no vería un problema. El problema es que puede saltarse las bases de datos. Lea el artículo de Aaron y él entra en más detalles.
Kenneth Fisher
1
Lo he visto omitir DBs por completo en más de una ocasión. Usa Aaron's, es mucho más confiable.
Kris Gruttemeyer
11

Sin estar en desacuerdo con nada de lo que @Kenneth dijo, debo señalar que el error con el que te encuentras no tiene nada que ver sp_MSForEachDB. Se debe a cómo se nombró la base de datos: comienza con un número. Las reglas para nombrar objetos (no solo bases de datos) se detallan en la página de MSDN para identificadores de bases de datos . Si sigue las "Reglas para identificadores regulares", entonces no necesita encerrar esos nombres entre corchetes o comillas dobles. Pero los nombres que quedan fuera de esas reglas no necesitan ser cerrado (siempre).

Solomon Rutzky
fuente
1
Gracias por esta información también: no tenía conocimiento de esa restricción. Lamentablemente, esa base de datos se creó una década antes de
unirme
@ Jeff.Clark No estaba sugiriendo que cambie el nombre de la base de datos como mencionó en la pregunta de que no puede cambiarla. Solo quería que usted (y otros) conocieran el problema real, ya que volverá a aparecer cada vez que necesite especificar ese nombre de Base de datos en cualquier lugar. Y leer ese conjunto completo de reglas puede ayudarlo a evitar que las otras cosas que requieren un nombre (Base de datos, Tabla, Columna, Índice, Restricción, etc.) siempre se incluyan entre corchetes o comillas dobles.
Solomon Rutzky