解析 SQL 脚本以提取表名和列名

Posted

技术标签:

【中文标题】解析 SQL 脚本以提取表名和列名【英文标题】:Parse SQL Script to extract table and column names 【发布时间】:2015-09-13 21:37:11 【问题描述】:

如果我有一个 SQL 脚本,有没有办法将脚本中引用的列和表解析并提取到类似结构的表中:

脚本:

Select t1.first, t1.last, t2.car, t2.make, t2.year
from owners t1
left join cars t2
on t1.owner_id = t2.owner_id

输出:

Table   Column
owners  first
owners  last
owners  owner_id
cars    car
cars    make
cars    year
cars    owner_id

【问题讨论】:

您是在问是否有可能或是否有简单的方法?除非您可以将输入限制为语法的简单而严格的子集,否则您必须为 SELECT 及其相关表达式定义语法...h2database.com/html/grammar.html#select @THK 我猜两者都有。似乎这发生在 sql 执行过程中的某个地方,并且很好奇是否有人将其变成了库。 有点令人惊讶的是,似乎没有任何独立的解析器被广泛接受为权威。有一些关于该主题的 SO 主题:***.com/questions/660609/sql-parser-library-for-java。 Python 有 sqlparse 库,但它不验证语法。 如果您找到了解决方案,请告诉我? 【参考方案1】:

这就是你在 SQL Server 中想要的:

select t.name as [Table], c.name as [Column]
from sys.columns c
inner join sys.tables t
on c.object_id = t.object_id

【讨论】:

逻辑/关系需要从脚本/查询本身中提取,而不是从系统表中提取。 有时候列名不一样,会比较麻烦。【参考方案2】:

老问题,但很有趣,所以在这里 - 将您的脚本暂时转换为存储过程,强制 SQL Server 映射依赖项,然后您可以使用以下方法检索它们:

SELECT referenced_entity_name ,referenced_minor_name FROM sys.dm_sql_referenced_entities('dbo.stp_ObjectsToTrack', 'Object')

【讨论】:

以上是关于解析 SQL 脚本以提取表名和列名的主要内容,如果未能解决你的问题,请参考以下文章

sql 获取包含给定字符串的表名和列名

Java 中获得Access 数据库中的表名和表中的列名 及每个列的数据类型

ORA-00904: 标识符无效但表名和列名正确?

如何通过从数据库中获取表名和列名来更新 Oracle 表?

打印表名及其列名的 SQL 语句

SQL VBA:选择具有特定表名和字段名的所有表