quinta-feira, 5 de fevereiro de 2026

Relatórios HTML Direto do SQL Server: Simples, flexível e sem ferramentas de terceiros

                                                                                                          Imagem gerada via IA



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:

  1. Descoberta automática das colunas
    A procedure identifica dinamicamente as colunas retornadas pelo SELECT, sem necessidade de mapeamento manual.

  2. Montagem do HTML (thead, tbody e tfoot)
    Cada coluna gera automaticamente seu <th> e seus <td>, respeitando regras de alinhamento e formatação.

  3. 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:

SELECT ValorReceber|S, ValorPago|S FROM ...

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_AGG por FOR XML PATH('') + STUFF

  • Utilizar 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