采取此查询:
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
答案 0 :(得分:1)
此处的解决方案实际上是与continuous integration相结合的查询的单元测试。您有JDBC代码形式的查询。编写单元测试以连接到相关数据库并以至少看看它们是否执行的方式运行查询是很容易的,即使您不关心结果,这是您正在谈论的标准
可以说你可以扩展它来测量性能和/或结果,但我发现这些类型的测试非常脆弱,并且随着更多的变化不可避免地发生,它们会非常快速地破坏。