【发布时间】: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 ENFORCED 和 WITH (...) 块之类的 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
)
【问题讨论】:
标签: sql sql-server ssms ddl azure-synapse