Gerar relatórios é uma necessidade comum em praticamente qualquer aplicação corporativa. Em muitos cenários, a primeira ideia é recorrer a ferramentas externas, bibliotecas proprietárias ou motores de relatórios complexos. Mas… e se fosse possível gerar relatórios completos usando apenas SQL Server, HTML e CSS puro?
Foi exatamente com esse objetivo que esta procedure foi criada.
A proposta
A SP_GerarHtmlRelatorioGenerico foi desenvolvida para transformar qualquer SELECT ou VIEW em um relatório HTML, totalmente formatado, sem depender de soluções externas.
A ideia central é simples:
-
O SQL Server gera os dados
-
O próprio SQL monta a estrutura HTML
-
O CSS define o visual
-
A aplicação apenas consome o HTML pronto
Essa abordagem é especialmente útil em cenários como:
-
Relatórios enviados por e-mail
-
Visualização em sistemas web internos
-
Aplicações legadas que não utilizam motores modernos de relatório
Apesar de o HTML puro ter suas limitações, quando combinado com CSS e JavaScript, ele se torna extremamente poderoso. Com criatividade, é possível evoluir esse modelo para incluir interações, destaques visuais e até gráficos embutidos no relatório.
Como a procedure funciona
A procedure recebe três parâmetros principais:
-
@SqlSelect: a instrução SQL responsável por retornar os dados
-
@TituloRelatorio: título exibido no topo do relatório
-
@Html (OUTPUT): saída final contendo todo o HTML gerado
Internamente, ela executa três etapas bem definidas:
-
Descoberta automática das colunas
A procedure identifica dinamicamente as colunas retornadas pelo SELECT, sem necessidade de mapeamento manual. -
Montagem do HTML (thead, tbody e tfoot)
Cada coluna gera automaticamente seu<th>e seus<td>, respeitando regras de alinhamento e formatação. -
Geração do documento HTML completo
O resultado final já vem com<html>,<head>,<style>e<body>, pronto para ser exibido ou enviado
Alinhamento e formatação inteligente
O script já traz regras automáticas para melhorar a legibilidade:
-
Valores numéricos → alinhados à direita
-
Textos → alinhados à esquerda
-
Datas, data/hora e IDs → centralizados
Essas regras podem ser facilmente ajustadas conforme o padrão visual desejado.
Somatórios automáticos no rodapé
Um detalhe interessante é o suporte nativo a totalização de campos numéricos.
Para que uma coluna seja somada no rodapé do relatório, basta adicionar |S ao apelido da coluna no SELECT.
Exemplo conceitual:
A procedure detecta automaticamente essa marcação e gera o <tfoot> com os totais formatados.
Sobre a saída do HTML
Para melhor visualização do HTML gerado, recomenda-se configurar a ferramenta de consulta (SSMS, por exemplo) para exibir o resultado como texto, preservando a identação.
A identação não segue rigorosamente o padrão HTML oficial — ela existe apenas para facilitar a leitura humana.
Segurança: atenção ao SQL Injection
Ponto crítico
O parâmetro @SqlSelect não deve aceitar entrada direta do usuário.
Permitir que usuários finais informem o SQL abre brechas sérias de SQL Injection.
O uso correto pressupõe que:
-
Apenas suas aplicação chame a procedure
-
O SQL seja previamente validado
-
Ou o relatório seja baseado em SELECTs controlados (views, templates fixos, etc.)
Compatibilidade e versão do SQL Server
Este script foi desenvolvido e testado no SQL Server Express 2022.
Entretanto, ele utiliza recursos introduzidos em versões específicas:
STRING_AGG→ disponível a partir do SQL Server 2017 (14.x)sys.dm_exec_describe_first_result_set→ disponível a partir do SQL Server 2012
Caso você utilize versões anteriores, é possível adaptar o código:
Substituir
STRING_AGGporFOR XML PATH('') + STUFFUtilizar tabelas temporárias no lugar da DMV
Link do script aqui 👇
Conclusão
Essa procedure mostra que o SQL Server pode ir além de simplesmente armazenar dados.
Com uma abordagem criativa, é possível gerar relatórios visuais, organizados e reutilizáveis, sem depender de ferramentas externas.
HTML pode parecer simples, mas quando bem utilizado, entrega resultados surpreendentes — e o banco de dados pode ser parte ativa desse processo.
Se você gosta de soluções enxutas, controle total e menos dependências, essa abordagem certamente merece um lugar no seu arsenal técnico.
Espero ter ajudado e principalmente, simplificado
