【问题标题】:How do I validate if a ANSI SQL has Syntax errors or a DDL sentence?如何验证 ANSI SQL 是否有语法错误或 DDL 语句?
【发布时间】:2012-12-18 18:38:12
【问题描述】:

我想在不执行代码的情况下了解这两件事。

有没有办法在不编写半编译器的情况下做到这一点?

在我发送它执行之前,我会将一个 sql 传递给一个进程或验证这些东西的东西......


@EDIT:评论问题的答案:

你要验证什么?

  • ANSI SQL 语法,并了解它们是否使用 DDL 语句。

这个用户是否输入,如果是,他们是如何输入 SQL 语句的?

  • 他们编写了一个 *.sql 文件。我只是在不知道他们在哪里(在什么 IDE 中)编写它的情况下收到它,我必须验证 ANSI 语法(而不是语义)

这是来自代码吗?你是如何执行代码的?

  • 我不应该执行它。运营员工会这样做。需要的时候。如果您的意思是 代码 与我正在寻找的 ANSISyntaxAndDDLCheckerSomething 相关,我会使用控制台应用程序运行它...可能使用 .Net

【问题讨论】:

  • 您要验证什么?这个是用户输入吗,如果是,他们是如何输入 SQL 语句的?这是来自代码吗?你是如何执行代码的?

标签: sql validation ddl ansi-sql


【解决方案1】:

实际上,没有什么可以验证 SQL 的完整 SQL 分析器(例如在 DBMS 中找到的分析器)。这是双重事实,因为根据 SQL 标准有效的内容不一定根据您的目标 DBMS 有效。 SQL standard 的语法大而复杂。描述语言主要语法的BNF 未规定允许的内容有很多限制。

语义检查也非常复杂。例如,如下语句:

SELECT * FROM SomeTable;

在语法上是正确的(您可以看到,我也可以看到),但是无法知道它是否会针对给定的数据库成功执行。这取决于执行查询时数据库中是否存在名为SomeTable 的表。添加显式列名,并且您必须在执行查询时检查列名是否有效。您可能有一个语法有效的 CREATE TABLE 语句,但该语句将无法执行,因为存在一个与已存在的表同名的视图。

如果您准备一个语句而不执行它,您会对该语句进行语法和语义检查。这可能是找出您所追求的最可靠的方法。

【讨论】:

  • 我不是在寻找语义检查。只是语法和 DDL ......你永远不能期望在没有编译器的情况下验证语义。但也许语法检查,或特定格式检查和/或查询上是否存在(布尔定义)DDL,也许是在没有编译器的情况下可以做到的事情。
  • 我的意思是 IDK,但也许 sqlparser.com 有类似我正在寻找的东西,但我不确定我是否走在正确的轨道上。
  • 如果服务器支持使用 MODE ANSI 创建数据库,ANSI/ISO SQL 语句是否与该数据库兼容?
  • @FrankComputer:Informix 样式的“MODE ANSI”数据库接受标准和非标准 SQL 语句。有一个选项 -ansi 可用于为非 ANSI 语句(或语句的组件不是 ANSI 的语句)生成警告。但这都是 Informix 独有的。
  • 实现 SQL 语句数据库独立性的替代方法虽然有限,但可以使用 HQL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 2022-01-06
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
相关资源
最近更新 更多