我想编写一些可以在几乎所有数据库中运行而没有任何 SQLExceptions 的查询。那么,我在哪里可以获得 ANSI 标准来编写查询?
5 回答
不确定这会帮助你。
供应商在标准实施方面是触手可及的,而且标准本身通常不够精确,以至于您永远无法编写适用于所有实施者的查询。
例如,SQL 92 将连接运算符定义为,||
但 MySQL 和 MSSQL 都没有使用它(Oracle 使用)。供应商独立的字符串连接是不可能的。
同样,未指定标准转义字符,因此您的处理方式可能不适用于所有供应商。
话说回来:
SQL 92: http: //www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt
带有 SQL 99 ISO 文档链接的 Wiki 文章: http ://en.wikipedia.org/wiki/SQL:1999
来自维基百科:
SQL 标准不是免费提供的。整个标准可以从 ISO 作为 ISO/IEC 9075(1-4,9-11,13,14):2008 购买。
尽管如此,我不建议您遵循此策略,因为没有数据库引擎完全遵循任何 SQL 标准(SQL 99、2003 等)。他们都在处理指令或定义变量的方式上自由(例如,当比较两个字符串时,不同的引擎以不同的方式处理区分大小写)。一种对一个引擎非常有效的方法对于另一个引擎来说可能是非常低效的。
一个建议是开发一组标准查询并开发不同的类,这些类包含特定目标 RDBMS 的查询的特定实现。
希望这有帮助
查看http://savage.net.au/SQL/上提供的核心 SQL 语法的 BNF
这是答案的一部分——正如 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 不是可行的方法,正如其他答案所表明的那样,由于标准的不同“解释”。相反,如果可能,您应该在您的应用程序中拥有某种数据访问层,该层对每个数据库都有不同的实现。根据您要执行的操作,有诸如 Hibernate 之类的工具将为您承担很多繁重的工作。