我想编写一些查询,这些查询几乎可以在所有数据库中起作用,而无需任何SQLEXceptions。那么,我在哪里可以获得ANSI标准来编写查询?

有帮助吗?

解决方案

不确定会为您提供帮助。

供应商可以触摸并进行标准实施,而且标准本身通常不精确,因此您永远无法编写与所有实施者一起使用的查询。

例如,SQL 92将串联操作员定义为 || 但是MySQL和MSSQL都不使用此(Oracle DO)。供应商独立字符串串联是不可能的。

同样,也没有指定标准逃生字符,因此您如何处理可能在所有供应商中不起作用。

话说回来:

其他提示

维基百科:

SQL标准无法自由使用。整个标准可以从ISO/IEC 9075(1-4,9-11,13,14):2008购买。

尽管如此,我不建议您遵循此策略,因为没有数据库引擎遵循任何SQL标准(SQL 99,2003等)。他们所有人都以他们处理指令或定义变量的方式进行自由(例如,在比较两个字符串时,不同的引擎以不同的方式处理案例灵敏度)。一种非常有效的一种发动机的方法对于另一种发动机而言可能是可怕的。

一个建议是开发一个标准的查询组,并开发不同的类别,这些类别包含针对某个目标RDBMS的特定查询实现。

希望这有所帮助

查看可用的核心SQL语法的BNF http://savage.net.au/sql/

这是答案的一部分 - 正如基拉努(Kiranu)和马特米切尔(Mattmitchell)指出的那样,其余的是不同的供应商以不同的方式实施标准。尽管大多数都非常接近,但没有DBMS完美地粘附在SQL-92上。

一个观察结果:SQL标准对索引一无所知 - 因此没有用于创建索引的标准语法。它还没有说明如何创建数据库;每个供应商都有自己的机制。

SQL-92标准 可能是您要定位的。我相信它得到了大多数主要RDBMS的支持。

这里有一个 更少的简短链接. 。样本内容:

  • PostgreSQL有视图。通过不允许更新视图来违反标准...
  • DB2至少符合SQL-92。
  • MSSQL至少符合SQL-92。
  • MySQL至少符合SQL-92。
  • Oracle至少符合SQL-92。
  • Informix至少符合SQL-92。

如果您使用的.NET,您可能会考虑使用的其他内容是使用 system.data.common中的工厂模式 在许多RDBMS中抽象提供商细节方面非常有效。

如果您试图制造一种可以在多个数据库中使用的产品,我认为尝试仅使用标准SQL并不是其他答案,因为标准的“解释”不同。相反,如果可能的话,您应该在应用程序中具有某种数据访问层,该数据访问层对每个数据库具有不同的实现。根据您要做的事情,冬眠等工具将为您提供很多繁重的举重。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top