供应商中立的SQL

时间:2010-04-15 14:38:18

标签: sql vendor-neutrality

我目前正在开发一个Web应用程序项目,该项目可能安装在具有各种软件配置的多个不同服务器上。我想通过允许用户安装各种SQL服务器来使我的应用程序尽可能灵活。问题是任何两个服务器供应商使用的SQL语法都不匹配。举一个简单的例子,这里是MS SQL和MySQL的相同SELECT语句:

MS SQL - SELECT TOP 1 * FROM MyTable ORDER BY DateCreated DESC

MySQL - SELECT * FROM MyTable ORDER BY DateCreated DESC LIMIT 1

是否有任何标准方法可以为各种供应商抽象语句创建?讨论这个问题的任何在线资源或书籍?我觉得有用的任何提示或聪明的评论都是有用的吗?

更多信息:我正在将我们的应用程序编写在Windows服务器上运行的vanilla ASP中。

谢谢,Spara

3 个答案:

答案 0 :(得分:4)

您可以符合ANSI SQL 92.我所知道的所有主要RDBMS都支持这一点。

然而,为了增强自己的SQL风格,个别RDBMS制造商已经添加了很多东西。那就是你陷入困境的地方。

您可能必须在代码中分支,具体取决于您要连接的RDBMS,并在此时生成/选择适当的SQL语句。

更好的选择是为每个受支持的RDBMS创建DAL。在DAL之间实现DAL接口以使它们统一。这应该比切换代码更容易。

我建议您不要试图取悦所有人,而应编写代码,以便支持您希望部署的前一个或两个系统,并在需要时添加对其他RDBMS的支持。

答案 1 :(得分:2)

我建议您使用ORM(linq,nhibernate等)来抽象SQL方言而不是尝试编写普通的SQL语言。

修改:Is there an OR/M for Classic ASP?

答案 2 :(得分:0)

你知道,我打赌你可以用严格的ansi sql来完成它,它只需要付出一些努力,可能需要额外的工作。即。

SELECT MAX(*) FROM mytable ORDER BY datecreated DESC;

ansi中会有变通方法,因为实际上所有特定于db的构造都是缩短和/或缩短现有获取或描述数据方式的方法。另一种选择可能是将对各种数据库的访问限制为存储过程和用户​​定义的函数。这样,你就可以为你知道将要使用的一堆dbs编写脚本,并要求在应用程序运行之前运行你的db特定脚本。 只是一个想法。