2012-06-29 48 views
0

我竞选的形式如何规避为Sybase ASE和

WHERE x IN (:1, :2, :3, :4, ..., :3001, :3002) 

上面的例子描述了大条件jOOQ集成测试绑定值的SQL Server的最大数,有在许多绑定变量IN条件。 Oracle对IN条件的括号之间的1000个值(绑定值或内联值)有一个众所周知的限制。解决方法很简单,只写:

WHERE x IN (:1, :2, :3, :4, ..., :1000) OR x IN (:1001, ...) 

的Sybase ASE 15.5和SQL Server 2008 R8,另一方面似乎对绑定值的数量总体限制:分别为Sybase ASE和SQL Server 2000的2100 。换句话说,似乎没有办法使用这两个数据库的绑定值拆分/转换上述条件。有没有办法绕过这个问题,而不是内联所有绑定值?

回答

0

我们终于在jOOQ中实现这个方法的方法是使用ControlFlowException在我们遇到任何限制后中止使用绑定值呈现SQL。这些限制是:

  • SQLite的:999个
  • 安格尔10.1.0:1024
  • 的Sybase ASE 15.5:2000
  • 的SQL Server 2008:2100

我们也博客上讲述这里:

一旦达到此限制,ControlFlowException就会在查询渲染站点被捕获,在那里它被简单地重新渲染,并且所有绑定值都是内联的 - 它总是有效的(直到遇到查询大小限制课程)。

我们假设内联绑定值以及在这些情况下产生的重复性硬解析行为是可以的,因为执行计划可以真正重复使用这种高度动态的SQL的机会很渺茫。

1

如果您创建一个表类型,然后说IN (SELECT column FROM @variableThatIsMyTableType)那么你根本没有限制。

我不会反刍MSDN - 其中涵盖table types and table valued parameters here

的SQL那么你生成看起来类似:

DECLARE @variableThatIsMyTableType mySchema.myTableType 
INSERT @variableThatIsMyTableType VALUES (1) 
INSERT @variableThatIsMyTableType VALUES (2) 
EXEC proc @variableThatIsMyTableType 

然而,从C#和SqlClient中提交这个时候,它会创建什么叫做“平凡计划” - 你可以阅读有关台湾居民入境许可证和琐碎的计划herehere。通过SQL直接做它会导致一个缓存计划,所以你的里程可能会有所不同。

+0

这当然看起来像是一种可行的方法来规避问题。另一方面,我完全控制jOOQ提供的SQL,所以在这种情况下,内联所有绑定变量将比创建特别表类型更简单。 –

+0

是的,它看起来像是一个'六个一个半其他'的情况。 –