【问题标题】:Vendor neutral SQL供应商中立 SQL
【发布时间】:2010-04-15 14:38:17
【问题描述】:

我目前正在开发一个 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 编写我的应用程序。

谢谢,斯帕拉

【问题讨论】:

  • 为什么您要使用一种已过时且完全弃用且不受支持的脚本语言编写新的 Web 应用程序?
  • 出于同样的原因,我仍然在纯汇编中编码 - 没有人可以回答“为什么不?”的问题。怎么样 1) 我有一个庞大的代码库可以在 ASP 中工作 2) 我只需要记事本来更新/更正/更改 ASP 应用程序 3) ASP 是轻量级的并且不那么迟钝 4) ASP 与 ASP.NET 5 的托管要求更少) 因为我想...仅仅因为一种语言已被替换并不意味着它不再有用。
  • 我从来没有听说过 ASP 比 .NET“慢”。事实上,你所有的理由似乎都是假的,让你听起来像是对现在古老技术的热爱。
  • IMO,在 ASP 经典中做一个网站正确要困难得多。日志记录、异常处理、url 重写、继承等等。要在 ASP Classic 中实际获得与 ASP.NET 站点相同的功能,需要比在 ASP.NET 中更多数量级的代码和更严格的开发人员纪律。
  • 经典 ASP 具有与 PHP 相同的功能,但仍然经常使用。幸运的是,这是一个关于供应商中立性的问题,而不是使用什么语言。因为我是这个项目中唯一的程序员,所以我可以安全地选择我想要的任何语言。由于上述原因,我选择了经典的 ASP。

标签: sql vendor-neutrality


【解决方案1】:

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

但是,各个 RDBMS 制造商添加了大量的东西来增强他们自己的 SQL 风格。这就是你陷入困境的地方。

您可能需要根据您要连接的 RDBMS 在代码中进行分支,并在此时生成/选择适当的 SQL 语句。

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

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

【讨论】:

  • SQL 92 标准有多个级别,它们都只符合“入门级” - 使其价值有限。
  • 尽可能使用标准语法当然是一个好的开始。但是在我上面给出的简单示例(TOP vs LIMIT)上它完全失败了。关于您以后的分支和添加供应商 - 这似乎是一项疯狂的工作。为每个语句创建一个分支,然后返回并稍后更新它们听起来很乏味。我开始考虑将语句存储在某处并在需要时检索正确的语句……但我想我曾经在 thedailywtf.com 上读到过。
  • @Sparafusile - 坦率地说,这是唯一明智的做法。无论您是否使用 ORM 构建 DAL。此外,在 ASP 经典中执行此操作将比在 .NET 中执行此操作显着更多工作,在 .NET 中您可以创建一个基类,其功能适用于所有受支持的数据库产品版本和派生类,以满足您需要的情况产品版本特定功能。
【解决方案2】:

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

编辑:Is there an OR/M for Classic ASP?

【讨论】:

  • 这两个听起来都是好主意,但我没有使用 .NET,所以两者都行不通。
【解决方案3】:

您知道,我敢打赌您可以使用严格的 ansi sql,它只需要一些努力并且可能需要额外的工作。即

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

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

【讨论】:

  • 这不是有效的 MS SQL 语句。我没有检查 MySQL。
  • 这只是我的想法,但如果你想要单行响应,有多种方法可以做到。我仍然认为,通过一些挖掘和变通,您应该能够在香草味的 ansi sql 中编写您可能需要的大部分内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 2011-05-06
  • 2017-04-27
相关资源
最近更新 更多