Procedures Não Documentadas no SQL Server 2000

Existem diversas procedures não documentadas no SQL Server 2000. Por que não são documentadas? Boa pergunta. O que posso dizer com plena convicção é que são bastante úteis e costumo utilizá-las em várias rotinas administrativas que estão sob minha responsabilidade. Vale ressaltar que, como todo processo não documentado, sua utilização deve ser vista com cautela pelo fato de não existerem garantias concretas de que tais procedimentos continuarão existindo em novas versões do produto.

Como a listagem dessas procedures é extensa, estarei periodicamente voltando a esse assunto. Seguem alguns exemplos.

sp_MSForEachDb

Utilize essa sp para executar um ou mais procedimentos em todos os databases de um servidor. Por exemplo, vamos imaginar uma rotina para checagem da integridade de databases. Você possui algumas opções:

1. Utilizando um script com linhas de comando fixas

dbcc checkdb(‘northwind’)
dbcc checkdb(‘pubs’)
dbcc checkdb(‘master’)

.

...

2. Utilizando um cursor para executar o comando DBCC em todos os databases:

declare cr_Cursor cursor fast_forward
for

     select name from master.dbo.SysDatabases

declare @database varchar(200)
declare @cmd varchar(200)
open cr_Cursor

fetch next from cr_Cursor into @database
while (@@fetch_status <> -1)
begin
          if (@@fetch_status <> -2)
          begin
               set @cmd = 'dbcc checkdb('+''''+@database+''''+')'
                         print ''
               print '-------------------------------------------'
               print '>>>> Database: '+ @database
               print '-------------------------------------------'
                         exec (@cmd)
          end
          fetch next from cr_Cursor into @database
end

close cr_Cursor
deallocate cr_Cursor

3. Utilizando a procedure sp_MSForEachDB, para realizar o mesmo procedimento

exec sp_MSForEachDB @command1="print '?'" ,
                                          @command2="DBCC CHECKDB ('?')"

Os parâmetros da procedure são:

Parâmetro

Obrigatório ?

Para que serve

@command1

Sim

Primeiro comando que se deseja executar.

@command2

Não

Segundo comando que se deseja executar

@command3

Não

Terceiro comando que se deseja executar

@replacechar

Não

Caractere que deverá ser substituído pelo nome do database nos parâmetros @command1..3. Quando não especificado, o caractere default será o sinal de interrogação ‘?’.

@precommand

Não

Comando que deverá ser executado ANTES de @command1..3

@poscommand

Não

Comando que deverá ser executado APÓS @command1..3

Comparando a opção 3 com as anteriores, percebemos que, além de simples, é bastante eficiente. Prevê a criação de novos databases (ponto onde a opção 1 deixa a desejar) e faz a mesma coisa que a opção 2, porém de maneira mais simples e objetiva.

sp_MSForEachTable

Executa um procedimento para todas as tabelas pertencentes a um database. Para reindexar todas as tabelas de um database:

EXEC sp_MSforeachTable @command1="print '>>>Tabela: ?'                                                @command2="DBCC dbreindex ('?')"

À exceção de @whereand (opcional para informar mais uma restrição a ser aplicada na tabela SysObjects), os outros parâmetros são os mesmos daqueles vistos na sp_MSForEachDB. Poderíamos utilizar o parâmetro @whereand para reindexar somente as tabelas cujo nome iniciasse por “or”:

use NorthWind
go
EXEC sp_MSforeachTable @command1="print '>>>Tabela: ?' ",
                                               @command2="DBCC dbreindex ('?')"
                                               @whereand=" and left(name,2)='Or'"

-------------------------------------------------------------------------------

>>>Tabela: [dbo].[Orders]
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
>>>Tabela: [dbo].[Order Details]
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Bem pessoal por hoje é só.

Forte abraço a todos e até a próxima!