Como Executar o Mesmo SELECT em Todos os Bancos de Dados no SQL Server
🔄 Como Executar o Mesmo SELECT em Todos os Bancos de Dados no SQL Server
Imagine que você precisa rodar a mesma consulta SQL em todos os bancos de dados de um servidor SQL Server — por exemplo, buscar registros em uma tabela chamada Clientes
presente em vários bancos. Fazer isso manualmente pode ser demorado e propenso a erros. Neste post, vou te mostrar como automatizar essa tarefa utilizando cursores e SQL dinâmico.
🎯 O Que Vamos Fazer?
Vamos criar um script que:
- Lista todos os bancos de dados do servidor (exceto os bancos do sistema).
- Percorre cada banco de dados com um cursor.
- Executa um SELECT dinâmico no contexto de cada banco.
- Retorna os dados incluindo o nome do banco de onde vieram.
💻 O Código
DECLARE @dbname NVARCHAR(128)
DECLARE @sql NVARCHAR(MAX)
-- Cursor para percorrer os bancos de dados
DECLARE db_cursor CURSOR FOR
SELECT name
FROM sys.databases
WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb') -- Ignora bancos do sistema
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = '
BEGIN TRY
USE [' + @dbname + '];
SELECT ''' + @dbname + ''' AS DatabaseName, * FROM Clientes
END TRY
BEGIN CATCH
PRINT ''Erro no banco: ' + @dbname + ' - '' + ERROR_MESSAGE()
END CATCH'
EXEC sp_executesql @sql
FETCH NEXT FROM db_cursor INTO @dbname
END
CLOSE db_cursor
DEALLOCATE db_cursor
🧠 Entendendo o Script
🔹 sys.databases: Essa visão do sistema contém todos os bancos de dados do servidor. Filtramos os bancos do sistema (master
, tempdb
, etc.) para evitar acessos desnecessários.
🔹 Cursor: Um cursor percorre todos os bancos encontrados, armazenando o nome de cada um na variável @dbname
.
🔹 SQL Dinâmico: Montamos dinamicamente uma string com o SELECT
, usando USE [@dbname]
para mudar o contexto do banco.
🔹 TRY...CATCH: Incluímos um bloco de tratamento de erros para evitar que um banco com problemas interrompa toda a execução.
🧪 Resultado
O script vai trazer os resultados do SELECT
para cada banco, com uma coluna extra chamada DatabaseName
para indicar de qual banco cada linha veio. Muito útil para consolidação de dados ou auditorias!
⚠️ Cuidados
- Certifique-se de que a tabela (
Clientes
no exemplo) exista em todos os bancos. - Se os esquemas forem diferentes entre bancos, pode ser necessário adaptar o SELECT.
- Evite rodar em produção sem testar antes — preferencialmente use um ambiente de homologação.
✅ Conclusão
Esse tipo de automação pode poupar horas de trabalho repetitivo e garantir mais consistência nas consultas em múltiplos bancos. Com uma abordagem simples de cursor + SQL dinâmico, conseguimos varrer o servidor inteiro de forma eficiente e controlada.
Se quiser estender essa técnica para UPDATE
, INSERT
ou verificações de estrutura, o princípio é o mesmo — apenas adapte o SQL gerado.
0 comentários:
Postar um comentário