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!