Hoje precisei pesquisar um determinado registro em várias no SQL Server mas não queria ter que ir no SQL Management Studio base a base para executar o script, até porque em algumas bases pode não existir as tabelas necessárias para executar o meu script.
Para facilitar esse processo repetitivo existe a proc sp_MSforeachdb que executa o script em todas as bases.
DECLARE @Command VARCHAR(1000) SELECT @Command = 'USE [?]; IF COL_LENGTH(''[dbo].[products]'', ''Id'') IS not NULL ALTER TABLE dbo.products ADD description varchar(5000)' EXEC sp_MSforeachdb @Command
Detalhando o script
Descrevendo o trecho de código veremos que primeiramente iremos declarar uma variável para armazenar o comando a ser executado:
DECLARE @Command VARCHAR(1000)
Logo após iremos armazenar o script que desejamos executar na variável.
SELECT @Command = 'USE [?]; IF COL_LENGTH(''[dbo].[products]'', ''Id'') IS not NULL ALTER TABLE dbo.products ADD description varchar(5000)'
E por fim executamos o script no banco.
EXEC sp_MSforeachdb @Command
Filtrar registros
Muitas vezes necessito trazer no resultado do select apenas as databases que possuem um determinado registro e para isso utilizo o script abaixo.
DECLARE @Schema VARCHAR(20) = 'dbo' DECLARE @Table VARCHAR(80) = 'configurations' DECLARE @ColumnToFilter VARCHAR(80) = 'FullName' DECLARE @Where VARCHAR(200) = @ColumnToFilter + ' = ''General.Caching.RedisHosts'' AND Value like ''%hlg%''' -- Não alterar os campos abaixo DECLARE @SchemaAndTable VARCHAR(80) = '[' + @Schema + '].[' + @Table + ']' DECLARE @Command VARCHAR(1000) SELECT @Command = 'USE [?]; IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE table_name = ''' + @Table + ''') AND COL_LENGTH(''' + @SchemaAndTable + ''', ''' + @ColumnToFilter + ''') IS not NULL BEGIN IF EXISTS ( SELECT 1 FROM ' + @SchemaAndTable + ' WHERE ' + @Where +') BEGIN SELECT ''?'' as dbname, T.Value FROM ' + @SchemaAndTable + ' AS T WHERE ' + @Where +' END END ' EXEC sp_MSforeachdb @Command
Pesquisar procedure que não contém determinado campo
DECLARE @Procedure VARCHAR(80) = 'pBasket' DECLARE @Column VARCHAR(200) = 'skuname' DECLARE @Command VARCHAR(1000) SELECT @Command = 'USE [?]; IF NOT EXISTS( SELECT 1 FROM sys.procedures p JOIN sys.sql_modules AS smv ON smv.object_id = p.object_id WHERE p.name = ''' + @Procedure + ''' AND definition like ''%' + @Column + '%'' ) BEGIN SELECT ''?'' as dbname END ' EXEC sp_MSforeachdb @Command
Atualização (19/10/2016) – Filtrar registros
Atualização (10/11/2016) – Pesquisar procedure que não contém determinado campo
Deixe um comentário