Muito útil em servidores com muitas bases, vamos aprender uma procedure não documentada pela Microsoft chamada sp_MSforeachdb. Como o próprio nome sugere, é utilizada para executar determinada query para cada base atachada na instância.
Para entendermos melhor, vamos ver na prática como funciona. No exemplo abaixo, observe que em vermelho somente o que faz parte da sintaxe da sp_MSforeachdb, em azul chamamos cada base, em verde está a query que será executada para cada base atachada, ,e por último em roxo, a aspas fechando:
EXECUTE master.sys.sp_MSforeachdb 'USE [?];
EXEC sp_spaceused'
Ou simplesmente:
EXEC sp_MSforeachdb 'USE [?];
EXEC sp_spaceused'
Repare que (1)chamamos a procedure - EXEC sp_MSforeachedb -, (2)abrimos uma aspas simples e fomos para a primeira base da lista - 'USE [?]; - e (3)já podemos rodar a query ou a procedure que desejamos para a base, lembrando de (4)fechar a aspas simples.
Resumindo:
EXEC sp_MSforeachdb 'USE[?]; procedure ou query '
Vamos fazer outro exemplo utilizando a legenda de cores:
EXEC sp_MSforeachdb 'USE[?]; EXEC sp_helpfile'
Você pode também executar mais de um comando, ex:
exec sp_msforeachdb @command1 = 'USE[?]; EXEC sp_helpfile',
@command2 = 'USE [?]; EXEC sp_spaceused',
@command3 = 'USE [?]; SELECT * from sys.databases'
Um último exemplo bem legal. Vamos alterar todas as bases para RESTRICTED USER (exceto master e tempdb):
EXEC sp_msforeachdb 'ALTER DATABASE[?] SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE'
Como as bases master e tempdb não podem ser setadas em RESTRICTED_USER, o SQL diz que dá erro mas todas as outras bases são alteradas.
Esta procedure não é documentada pela Microsoft, portanto, não há suporte ou material oficial da Microsoft que ensine a utilizá-la. Em compensação, não cai na prova de certificação 🙂
Siga o SQL Dicas!