gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 06:54:31 25 4
gpt4 key购买 nike

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

是否有已知的方法可以实现此目标?非常感谢。

我尝试过的事情:

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

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

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

  4. 二手 TSQL .TSQLStatementReader 来标记 DDL,但它提供单独的标记而不是 SQL 语句(例如,在 fiddle 中,PK 约束 NOT ENFORCED 被标记为 2 个标记,而不是应该的单个约束。

请注意,如果我手动删除 DW 特定构造,如 PK 约束 NOT ENFORCEDWITH (...) block ,那么 TsqlParser 会成功解析 DDL 和正确带出包含表、列和数据类型的 Create 语句。

示例 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
)

最佳答案

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

你的选择大概有以下几种:

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

关于SQL 数据仓库 DDL 解析器 - 如何解析 DW 特定结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65513328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com