Dicas sobre desenvolvimento de software, gestão e tributações

Rede Social

12 de maio de 2025

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