1

接受这个查询:

  SELECT *
    FROM MyTable
   WHERE MyColumn = 'SomeValue'
ORDER BY SomeFakeQualifier.MyColumn DESC

在这种情况下,似乎 SqlServer 只是忽略了限定符。如果你添加一个JOIN,那么它会考虑它。

这真的不是问题,除非您想让您的查询在 DBMS 供应商中可行。例如,Oracle 会理所当然地抱怨限定符无效。

是的,我们使用 ORM 消除了很多这种情况,但我们仍然需要 JDBC 来执行某些操作(这是我们产品的本质及其对动态查询的支持)。事实上,正是因为如此,才出现了这个问题——有人将 JPA 命名查询复制到了 JDBC 提供的查询中,但留下了对象名而不是表名。

所以我想问题是:还有其他人遇到过这个吗?如果是这样,测试代码以确保它可以在“主要三个”DBMS(SqlServer、Oracle、DB2)上工作的最佳方法是什么?我们有一个 QA 团队,但似乎应该有更好的方法来对这些特质进行单元测试。

请注意,我们总是尝试强制编写 ANSI SQL 以避免出现问题,但有些事情,比如前面提到的问题,可能会漏掉

我希望这是有道理的。如有必要,我可以提供更多上下文。

TIA

4

1 回答 1

1

您的解决方案实际上是结合持续集成对您的查询进行单元测试。您有 JDBC 代码形式的查询。编写单元测试以连接到您的相关数据库并以这样的方式运行查询很容易,即使您不关心结果,您至少可以看到它们是否执行,这是您正在谈论的标准.

可以说,您可以扩展它来测量性能和/或结果,但我发现这类测试非常脆弱,并且随着不可避免地发生更多变化,往往会非常非常快地崩溃。

于 2009-05-10T14:06:16.653 回答