Como exatamente o sp_msforeachdb funciona nos bastidores?

9

Preciso solucionar um problema que estou tendo e preciso de ajuda para entender como o sp_msforeachdb funciona para solucionar meu problema.

O que acontece é que sempre que executo sp_msforeachdb, recebo um erro Msg 102, Level 15, State 1, Incorrect syntax near '61'

Um exemplo do meu código é o seguinte:

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

No entanto, não importa qual consulta eu tenho como parâmetro para sp_msforeachdb. Toda vez que eu recebo o mesmo erro. Eu tenho um banco de dados que começa com '61s1d', o que me faz pensar que há um problema com o nome do banco de dados, mas sinceramente não sei o que está acontecendo nos bastidores no sp_msforeachdb.

Coisas a serem observadas.

  • É o único banco de dados que começa com um número
  • Eu posso tentar usar código como "Se o banco de dados é como '% 61%', não faça ......", mas ainda assim o mesmo erro.
  • Não consigo testar a alteração do nome do banco de dados - muitas coisas estão conectadas a ele.
  • Se eu criar um banco de dados de teste que comece com '51', também recebo o erro desse banco de dados

Como posso superar isso?

Jeff.Clark
fonte

Respostas:

16

Antes de tudo, não use sp_msforeachdb, pois possui vários problemas conhecidos. É melhor você usar a versão de Aaron Bertrand .

No entanto, ele usa um cursor, SQL dinâmico e uma substituição. Você pode realmente observar o código usando sp_helptext.

EXEC sp_helptext sp_msforeachdb

Se você usar esse código, ele corrigirá alguns dos seus problemas.

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

Os colchetes serão o problema específico que você mencionou. No entanto, você terá problemas se tiver um banco de dados com [ou] nele.

Kenneth Fisher
fonte
Interessante, usando colchetes ao redor do "?" no de funcionou. Vou analisar a versão de Aaron Bertrand. Você notou uma degradação significativa do desempenho por causa do cursor?
Jeff.Clark
2
Os cursores são apenas um problema real de desempenho quando você tem mais do que algumas linhas. A menos que você esteja chegando perto do número máximo de bancos de dados permitido, não verá um problema. O problema é que ele pode pular bancos de dados. Leia o artigo de Aaron e ele entra em mais detalhes.
Kenneth Fisher
11
Eu já vi pular completamente os DBs em mais de uma ocasião. Use o Aaron, é muito mais confiável.
Kris Gruttemeyer
11

Não discordando de nada do que o @Kenneth disse, devo salientar que o erro que você está encontrando não tem nada a ver sp_MSForEachDB. Isso se deve ao modo como o banco de dados foi nomeado: começa com um número. As regras para nomear objetos (não apenas bancos de dados) são detalhadas na página MSDN para identificadores de banco de dados . Se você seguir as "Regras para identificadores regulares", não precisará colocar esses nomes entre colchetes ou aspas duplas. Mas os nomes que estão fora dessas regras não precisam ser fechado (sempre).

Solomon Rutzky
fonte
11
Obrigado por esta informação também - eu não tinha conhecimento dessa restrição. Infelizmente esse banco de dados foi feito de uma década antes de me juntar a empresa :)
Jeff.Clark
@ Jeff.Clark Eu não estava sugerindo que você renomeie o banco de dados, como mencionado na pergunta, que não pode alterá-lo. Eu só queria que você (e outros) soubesse o problema real, pois ele surgirá novamente a qualquer momento que você precisar especificar o nome do banco de dados em qualquer lugar. E ler esse conjunto completo de regras pode ajudá-lo a evitar que outras coisas que exijam que um nome - banco de dados, tabela, coluna, índice, restrição etc. - sejam sempre colocadas entre colchetes ou aspas duplas.
Solomon Rutzky