解析 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 脚本以提取表名和列名的主要内容,如果未能解决你的问题,请参考以下文章