【问题标题】:How to parse correctly an SQL CREATE TABLE statement如何正确解析 SQL CREATE TABLE 语句
【发布时间】:2014-04-27 05:44:45
【问题描述】:

我需要解析 SQL "CREATE TABLE" 语句,以获取字段列表及其属性。

主要是 MySQL 语法,应该是(像这个例子一样带有不可控制的嵌套括号:

CREATE TABLE 'tablename' (
field1 INT,
field2 VARCHAR(10),
field3 FLOAT NOT NULL DEFAULT 0,
PRIMARY KEY (field1, field2),
(CONSTRAINT fk FOREIGN KEY whatever)
) options;

我可以轻松地隔离列定义,但我想拆分定义。逗号分隔是不可能的,因为它们可以在嵌套的括号中。

我可以遍历字符串以计算开始和结束字符串分隔符(引号等),计算开始和结束括号,因此我可以检测“第一级”逗号并对其进行拆分。

但我想知道是否没有更有效的方法,例如使用正则表达式,但我不擅长确定某些正则表达式是否可以匹配如此复杂的语法......

【问题讨论】:

    标签: c# sql regex parsing


    【解决方案1】:

    也许 its 会有用。您将像使用 sql 解析器一样使用它。而 this 用于正则表达式

    【讨论】:

    • 和上面一样,所以我决定自己去写一个新的“IndexOf”函数来查找分隔符作为逗号,注意它们是在嵌套括号中还是在字符串内部(指定一个字符串分隔符可以是双引号,也可以是著名的 MySQL 反引号 `)。也许它可能有性能问题,但它是一个偶尔的解析器,所以不管......无论如何,感谢正则表达式链接,非常有用!!!
    • 关于小字符串解析的信息。如果您不这样做 10000 次,您将不会感到性能问题。祝你好运
    • 无论如何,我更多的是寻找一种好的实践和更可维护的代码,而不是性能,但最终它可以工作,所以我会继续努力,感谢 Victor 的友好评论。
    【解决方案2】:

    您正在寻找的是分词器。 Microsoft 实际上包括一个作为 Visual Studio for SQL (Microsoft.Data.Schema.Dom) 的一部分。我不确定这是否只是 SQL 服务器,但根据您要解析的内容,即使这样也可以。

    此外,此link 将指导您使用一些替代方法来解析 SQL。

    【讨论】:

    • 许多链接都与 Select 语句有关,或者仅与 SQL Server 特定的语法有关,在我的情况下,它本质上是 MySQL 创建表,所以它可能不能很好地工作......
    • 该链接指向一个示例标记器,我知道。您需要为 MySQL 找到一个。这是一个支持 MySQL 的商业产品:sqlparser.com/index.php
    猜你喜欢
    • 2011-05-02
    • 1970-01-01
    • 2010-12-04
    • 2021-07-29
    • 1970-01-01
    • 2012-12-12
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多