SQL 数据仓库 DDL 解析器 - 如何解析 DW 特定的构造

Posted

技术标签:

【中文标题】SQL 数据仓库 DDL 解析器 - 如何解析 DW 特定的构造【英文标题】:SQL Data warehouse DDL parser - How to parse DW specific constructs 【发布时间】:2021-04-07 07:59:41 【问题描述】:

我的用例是接受 Azure Synapse DW DDL 作为输入,对其进行解析并从中提取 SQL 语句。此外,我不仅可以从基本语句(即,DECLARE,CREATE,ALTER,SELECT,...)中受益,还可以从其他 DDL 结构中受益,例如 PK 约束、索引、分布、分区等。

伸出手来了解是否有已知的方法可以实现这一目标?非常感谢。

我尝试过的事情:

    TsqlParser(所有 8 个可用版本 80,90,100,110,120,130,140,​​150)但它无法解析 DDL 并在几个特定于 DW 的令牌上出错。

    将自定义 TSqlConcreteFragmentVisitor 传递给 TSqlFragment,但它也没有检测到 Create table 语句(它可以访问 SELECT 语句,此处未显示在附加的 DDL 中)

    使用Microsoft.SqlServer.Management.SqlParser.Parser.Scanner 从 DDL 读取 SQL 批处理,但它将整个 DDL 识别为单个批处理。这没有帮助,因为我得到的输出基本上与我传入的输入相同。

    使用TSQL.TSQLStatementReader 对 DDL 进行标记,但它提供了单个标记而不是 SQL 语句(例如,在此处的 fiddle 中,PK 约束 NOT ENFORCED 被标记为 2 个标记,而不是应有的单个约束.

请注意,如果我手动删除诸如 PK 约束 NOT ENFORCEDWITH (...) 块之类的 DW 特定构造,则 TsqlParser 会成功解析 DDL 并正确显示带有表、列和数据类型的 Create statements。

示例 DDL:

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = N'tempschema_main')

EXEC('CREATE SCHEMA [schema_main]')

CREATE TABLE [schema_main].[temp_table]

(
    [TempId1] NVARCHAR(128) NOT NULL,

    [TempId2] NVARCHAR(128) NOT NULL,

    CONSTRAINT PK_TempPkColumnId PRIMARY KEY NONCLUSTERED (TempId1, TempId2) NOT ENFORCED
)

WITH 
(
    CLUSTERED COLUMNSTORE INDEX,

    DISTRIBUTION = ROUND_ROBIN
)

【问题讨论】:

【参考方案1】:

您可能会发现,SQL 解析并不简单 - 考虑到编写同一语句的不同方式的数量、语句中可用选项的数量以及语句中可以包含的语句级别数一个语句(即 selects within selects within selects),以及所有非标准但特定于特定 DBMS 的语法。

你的选择大概如下:

    您很幸运,可用的功能可以满足您的需求。根据您在问题中的陈述,您的情况并非如此,因为您尝试过的事情不起作用 如果您要处理的所有 DDL 都以相同的方式构建,那么编写自己的解析器(javascript、VBA 等)可能会更容易,只需使用您拥有的数据即可完成您想要的操作李> 使用商业 SQL 解析器。我知道唯一真正有效的是SQLParser。如果您遇到任何无法使用他们的工具正确解析的语法,那么他们会很快修复它。有一个免费版本,但(我认为)您的 SQL 语句中限制为几千个字符,因此您可能需要为此付费

【讨论】:

以上是关于SQL 数据仓库 DDL 解析器 - 如何解析 DW 特定的构造的主要内容,如果未能解决你的问题,请参考以下文章

分布式深度学习DDL解析

MySQL重点内容:查询语句名称解析

FLinkFlink SQL 解析嵌套的 JSON 数据

如何实现一个SQL解析器

如何实现一个SQL解析器

MySQL技术探索01实现SQL语法解析器