Procedures não documentadas do SQL Server

Ao se deparar com as situações de se rodar um comando ou executar uma atividade em todos os bancos de dados ou em todas as tabelas, você pode considerar a utilização das procedures não documentadas do SQL Server. Essas procedures executam atividades em loop através dos bancos ou tabelas.

Temos a seguinte situação: Preciso executar o comando CHECKDB em todos os meus bancos de forma automática.

Se não houvesse essas procedures poderíamos resolver esse problema criando um loop através da consultar a view para mostrar os bancos ou montar um script. No primeiro caso, a chance de você não obter uma performance aceitável é alta pois os script são otimizados para uma maior performance e o segundo ficaria preso a quantidade de databases no ato de criação do script, ou seja ao incluir ou dropar um banco, ou mesmo criar um banco de homologação ou desenvolvimento com um nome diferente você já teria que adaptar seu script.

Segue abaixo a sintaxe dos comandos:

sp_MSforeachdb

sp_MSforeachdb @command1, @replacechar,
@command2,
@command3, @precommand, @postcommand

Na qual:

Parametro

Descrição

Tipo

@command1

Primeiro comando que será executado em cada base de dados

Nvarchar(2000)

@replacechar

Representa o caractere que será representado pelo nome do banco de dados

Nvarchar(1)

@command2

Segundo comando que será executado em cada base de dados

Nvarchar(2000)

@command3

Terçeiro comando que será executado em cada base de dados

Nvarchar(2000)

@precommand

Comando que será executado antes dos comandos

Nvarchar(2000)

@postcommand

Comando que será executado após os comandos enviados

Nvarchar(2000)


 

Segue um exemplo utilizando a procedure sp_MSforeachdb:

sp_MSforeachdb @command1='DBCC checkdb(''?'')'

Verificando o comando acima, você pode notar que eu não coloquei o parâmetro replacechar. Esse comando não foi emitido pois o padrão para o replacechar é o caractere "?".

sp_MSforeachtable

sp_MSforeachdb @command1, @replacechar,
@command2,
@command3, @whereand,
@precommand, @postcommand

Na qual:

Parametro

Descrição

Tipo

@command1

Primeiro comando que será executado em cada base de dados

Nvarchar(2000)

@replacechar

Representa o caractere que será representado pelo nome do banco de dados

Nvarchar(1)

@command2

Segundo comando que será executado em cada base de dados

Nvarchar(2000)

@command3

Terçeiro comando que será executado em cada base de dados

Nvarchar(2000)

@whereand

Campo para adicionar informações sobre o objeto, por exemplo constraints.

Nvarchar(2000)

@precommand

Comando que será executado antes dos comandos

Nvarchar(2000)

@postcommand

Comando que será executado após os comandos enviados

Nvarchar(2000)


 

Segue um exemplo utilizando a procedure sp_MSforeachtable:

sp_MSforeachtable @command1='select * from ?'

Segue abaixo mais alguns scripts utilizando as procedures acima:

Diversos:

--Criando uma procedure em todos os databases
sp_MSforeachdb 'USE ? EXEC (''CREATE PROCEDURE DBA_BRASIL AS BEGIN SELECT 1 END'')'
sp_MSforeachdb 'USE ? DROP PROCEDURE DBA_BRASIL'


--Verificando as bases de dados no server
EXEC sp_MSForEachDB 'Use ?; SELECT DB_NAME()'

--Verificando os datafiles de cada database
EXEC sp_MSForEachDB 'Use [?]; EXEC sp_helpfile'

--Fazer shrink dos databases
EXEC sp_MSForEachDB 'DBCC SHRINKDATABASE (''?'' , 0)'

Verificando espaços utilizados:

-- Verificando os espaços utilizados pelas tabelas:
CREATE TABLE Plano_Capacidade (
TableName sysname,
Rows int,
Reserved varchar(255),
Data varchar(255),
Index_Size varchar(255),
Unused varchar(255)
)

INSERT INTO Plano_Capacidade
EXEC sp_MSForEachTable 'EXEC sp_SpaceUsed ''?'''

SELECT * FROM Plano_Capacidade

Atualizando estatísticas dos bancos de dados:

EXEC sp_MSForEachTable 'UPDATE STATISTICS ?'


 

Qualquer duvida ou script me envie para que possamos trocar algumas informações. Obrigado e até a próxima.

Comentários

Postagens mais visitadas deste blog

Diminuir arquivo de Transaction-log (LDF) do SQL Server nas versões 2000 e 2005

Erro: -147 ISAM error (Adicionar novo chunk ao DBSpace)