Executar o mesmo script em várias bases no SQL Server

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

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 uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *