Existe uma maneira de analisar uma consulta SQL para extrair os nomes das colunas e dos nomes das tabelas?

StackOverflow https://stackoverflow.com/questions/56677

  •  09-06-2019
  •  | 
  •  

Pergunta

Tenho mais de 150 consultas SQL em arquivos de texto separados que preciso analisar (apenas o código SQL real, não os resultados dos dados) para identificar todos os nomes de colunas e tabelas usados.De preferência com o número de vezes que cada coluna e tabela aparece.Escrever um novo programa de análise SQL é mais complicado do que parece, com instruções SELECT aninhadas e coisas do gênero.

Deve haver um programa ou código que faça isso (ou algo próximo a isso), mas não o encontrei.

Foi útil?

Solução

Na verdade, acabei usando uma ferramenta chamadaImpressora bonita SQL.Você pode comprar uma versão para desktop, mas acabei de usar o aplicativo online gratuito.Basta copiar a consulta na caixa de texto, definir a saída como "List DB Object" e clicar no botão Format SQL.

Funciona muito bem usando cerca de 150 consultas SQL diferentes (e complexas).

Outras dicas

Que tal utilizar o relatório Plano de Execução no MS SQLServer?Você pode salvar isso em um arquivo xml que pode então ser analisado.

Você pode querer procurar algo assim:

JSqlParser

que usa JavaCC para analisar e retornar a string de consulta como um gráfico de objeto.Nunca usei, então não posso garantir sua qualidade.

Se seu aplicativo precisar fazer isso e tiver acesso a um banco de dados que contenha as tabelas, etc., você poderá executar algo como:

SELECT TOP 0 * FROM MY_TABLE

Usando ADO.NET.Isso lhe daria uma instância de DataTable para a qual você poderia consultar as colunas e seus atributos.

Por favor, vá com antlr...Escreva uma gramática e siga os passos ... que são fornecidos no site antlr ... eventualmente você obterá AST (árvore de sintaxe abstrata).Para a consulta fornecida ...podemos percorrer isso e trazer todas as tabelas e colunas que estão presentes na consulta.

No DB2 você pode anexar sua consulta com algo como o seguinte, mas 1 é o mínimo que você pode especificar;ocorrerá um erro se você tentar especificar 0:

FETCH FIRST 1 ROW ONLY

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top