DBMS 供应商使用 SQL 方言功能来区分他们的产品,同时声称支持 SQL 标准。”纳夫对此说道。

您编写的 SQL 示例是否有无法转换为 SQL:2008 标准 SQL 的示例?

具体来说,我谈论的是 DML(查询语句),而不是 DDL、存储过程语法或任何非纯 SQL 语句的内容。

我还讨论了您在生产中使用的查询,而不是临时的查询。

1 月 13 日编辑

感谢您的所有回答:他们给我留下的印象是,许多特定于 DBMS 的 SQL 的创建是为了解决不良关系设计的问题。这让我得出你可能不会的结论 移植大多数现有应用程序。

有帮助吗?

解决方案

典型差异包括微妙地不同的充语义(例如甲骨文从在一些情况下其他SQL方言处理空值不同),不同的异常处理机制,不同类型和用于做这样的事情的字符串操作,日期操作或层次查询专有方法。查询提示也往往有语法跨平台而变化,并且不同的优化器可感到困惑在不同类型的构建体。

一个可以使用ANSI SQL跨数据库系统在大多数情况下,并期望得到一个数据库上合理的结果与像丢失的索引没有显著调整问题。然而,在任何非平凡的应用有可能对码的一些要求,即不能容易地便携地进行。

查询的少数,其中这导致一个问题 -

典型地,这要求将被相当的应用程序代码库中本地化。报告更可能抛出了这个类型的问题,做一般的报告查询,将整个数据库管理工作,是不太可能很好地工作。一些应用中是更可能引起悲伤比其他

因此,这是不可能的依托“便携” SQL构造为应用程序将在一般的情况下工作。一个更好的策略是使用通用的声明,他们将工作,打破了一个数据库特定层,在那里这是行不通的。

一个通用查询机制可以是使用ANSI SQL尽可能;另一种可能的方法将是使用一个O / R映射器,可采取各种数据库平台的驱动程序。这种机制应该能满足大部分的数据库操作,但需要你做它用完蒸汽的一些平台specifc工作。

您可能能够使用存储的过程作为一个抽象层用于更复杂的操作和代码的一组特定平台的存储过程的每个目标平台。该存储过程可以通过类似ADO.net访问。

在实践中,在放慢参数通过和异常处理的细微差异可能会导致使用这种方法的问题。更好的方法是生产包装了一个模块 有一个共同的接口特定于平台的数据库操作。不同的“驱动器”模块可以被交换进出取决于你使用的是什么DBMS平台。

其他提示

即使SQL:2008可以做一些事情,有时语法是不一样的。采取正则表达式匹配的语法,例如,SQL:2008使用LIKE_REGEX VS MySQL的REGEXP

是的,我同意,这是非常恼人的。

与Oracle的问题之一是,它仍然基于SQL 1992年ANSI标准。 SQL Server是在1999年的SQL标准,所以有些看起来像“扩展”的东西其实都是较新的标准。 (I相信 “OVER” 子句是其中之一。)

甲骨文也远远有关放置在子查询SQL更多的限制。 SQL Server是更加灵活和宽松的关于允许的子查询几乎任何地方。

SQL Server有一个合理的方式来选择一个结果的 “顶部” 行: “SELECT TOP 1 FROM客户ORDER BY SALES_TOTAL”。在Oracle,这成为 “SELECT * FROM(SELECT客户ORDER BY SALES_TOTAL)WHERE ROW_NUMBER <= 1”。

和当然还有总是Oracle的臭名昭著的SELECT(表达式)FROM DUAL。

编辑补充:

现在,我是在工作,并且可以访问我的一些例子,这里是一个很好的一个。这是通过LINQ到SQL生成,但它是一个干净的查询,从表中选择行41至50,分选后。它使用 “OVER” 子句:

SELECT [t1].[CustomerID], [t1].[CompanyName], [t1].[ContactName], [t1].[ContactTitle], [t1].[Address], [t1].[City], [t1].[Region], [t1].[PostalCode], [t1].[Country], [t1].[Phone], [t1].[Fax]
    FROM (
        SELECT ROW_NUMBER() OVER (ORDER BY [t0].[ContactName]) AS [ROW_NUMBER], [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]
        FROM [dbo].[Customers] AS [t0]
        ) AS [t1]
    WHERE [t1].[ROW_NUMBER] BETWEEN 40 + 1 AND 40 + 10
    ORDER BY [t1].[ROW_NUMBER]

SO 上常见

准确回答:

根据我的说法,由于数据类型优先级的原因,ISNULL 很容易在 SQL Server 上给出与 COALESCE 不同的结果 回答/评论 这里

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