【问题标题】:Set SQL Server Database to only allow ANSI Compliant SQL Code将 SQL Server 数据库设置为仅允许符合 ANSI 的 SQL 代码
【发布时间】:2015-02-24 10:08:14
【问题描述】:

有没有办法强制我的 sql server 数据库只使用 SQL Compliant 代码?

通过这种方式,SQL 代码可以轻松传输到其他数据库系统,如 Oracle、IBM 和其他符合 ANSI 的系统。

或其他可行的方法来获得相同的结果?

【问题讨论】:

  • 没有像 ANSI 兼容的 SQL 代码这样的东西。各种标准(SQL92、99、2003、2006、2008、2011)都有一致性级别,没有数据库完全符合所有这些标准。事实上,您提到的系统是一些最严重的违规者。
  • 您要解决的真正问题是什么?如果您修改它们,有 个默认值会导致非标准行为,例如将ANSI_NULLS 设置为关闭。在其他情况下,标准(故意)模糊到足以让供应商实现他们想要的任何东西
  • @PanagiotisKanavos 我正在构建一些将由前端应用程序触发的 SQL 存储过程。但是,我希望这些存储过程如此通用,以至于它们可以在各种 rdbms 上运行而无需更改。这将是理想的情况。
  • 那你看错了技术。存储过程或SQL/PSM 是标准化程度最低的。您提到的每个产品都有自己的procedural extensions为什么您要寻找通用过程而不是使用 ORM?
  • 我有 2 个原因,其中只有一个是有效的。我不熟悉ORM。其次,逻辑将比 CRUD 操作更复杂,并且也将用于大型数据集。我想 SQL 代码在 DB 引擎上比 ORM 更强大。已经感谢您的意见。

标签: sql sql-server ansi-sql


【解决方案1】:

不,不是真的。

但是,这并没有太大的区别 - 您可以在广泛不同的 SQL 引擎中使用相同的(ANSI 或其他)SQL 的想法只是一种错觉。现在常用的方法是使用为您构建查询的人 - 至少在发送 SQL 之前允许进行一些优化。如果这很重要,您甚至可以拥有不同的数据库结构。

即使是数据类型和它们的表示也可能在不同的数据库客户端之间有所不同。例如,现在我正在开发一个使用 DataSet 的遗留 Oracle 应用程序。在 Oracle 上,所有 numbers 在 C# 中都是 decimals。在 MS SQL 上,有些是 decimals,有些是 ints。即使使用纯粹的 ANSI SQL,您也需要处理这种微小的不兼容性,而且也很难追求性能。

例如,遗留应用程序中的一些 Oracle 查询使用显式索引 - 由于查询的构建和形成方式(糟糕),这确实是必要的,但仅限于 Oracle - MS SQL 似乎不需要它们全部。 MS SQL 执行计划器比 Oracle 更好地处理 SQL,反之亦然 - 一些性能关键查询在两个引擎上看起来完全不同。如果我可以为每个数据库结构设置不同的数据库结构,这将有助于提高性能很多。并且还有不同的开发范例——Oracle 代码在插入之前请求 ID(等等),而 MS SQL 的标准是让数据库引擎处理它——你只需确保代码端的关联被正确转换为数据库端的关系字段。

这只是两个主要的数据库引擎。 MySQL、Postgres、DB2 ......它们都有微小的怪癖,即使在全 ANSI 模式下也是如此。再加上 ANSI 标准甚至没有在任何中完全实现这一事实,而且泡沫很容易破裂。

即使使用中间体(如某些 O/RM 系统)也会暴露出大量漏洞。关键是尽可能远离任何具体事物 - 并确保每个人都清楚你无法跟上游戏的地方。

【讨论】:

  • 有人应该首先定义“ANSI 兼容”的含义以及我们所说的一致性级别。 没有数据库完全符合所有一致性级别,即使是 SQL92 标准
  • 我同意第一行。但是,我建议任何不以符合标准的方式实现“SQL:86”或 ANSI SQL 的引擎都不能真正称为 SQL 引擎。
  • @Jodrell 当然。但这只是整个画面的一小部分。仅仅理解语法并毫无歧义地应用它是容易的部分(即使这也不是 100% 完成的)。确保它确实运作良好,这是困难的部分。 ANSI SQL 很棒,但只是在一些小事情上,比如让 case 在 MS SQL 和 Oracle 上同样工作,这样你就不必将 decode 转换为 case 等。它确实不 意味着您可以为所有数据库编写相同的 SQL。抽象总是会泄漏。 ANSI SQL 泄漏了很多:D
  • @Jodrell ORDER BY 于 2008 年合法化,但所有产品都支持它,因为......好吧,我不记得那么远了。所有主要数据库都曾在某一时刻使用非标准扩展。我敢肯定,如果您检查 SQL86,您会发现所有异常 - 除非 SQL86 被取代以使最常见的扩展合法。
  • @PanagiotisKanavos order by 无处不在,真的。但它在任何地方的工作方式也略有不同。当然,不是在最简单的查询中。但是添加子查询、分组、联合、窗口函数……它们都有它们的小区别。
猜你喜欢
  • 1970-01-01
  • 2011-01-14
  • 2011-10-04
  • 1970-01-01
  • 2012-06-25
  • 2010-09-11
  • 1970-01-01
  • 2010-10-11
  • 2019-08-09
相关资源
最近更新 更多