0

我正在为表单的大型条件运行jOOQ集成测试

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

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 分别为 2000,SQL Server 分别为 2100。换句话说,似乎没有办法使用这两个数据库的绑定值来拆分/转换上述条件。除了内联所有绑定值之外,有没有办法绕过这个问题?

4

2 回答 2

1

如果你创建了一个表类型,然后说IN (SELECT column FROM @variableThatIsMyTableType)那么你就完全不受限制了。

我不会重复 MSDN - 这里涵盖了表类型和表值参数

然后生成的 SQL 类似于:

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

但是,当从 C# 和 SqlClient 提交时,它会创建所谓的“琐碎计划” - 您可以在此处此处阅读有关 TVP 和琐碎计划的信息。通过 SQL 直接执行此操作会导致缓存计划,因此您的里程可能会有所不同。

于 2012-06-29T22:57:24.383 回答
0

我们最终在jOOQ中实现这一点的方式是在遇到任何限制时使用 aControlFlowException中止带有绑定值的 SQL 渲染。限制是:

  • SQLite:999
  • 入口 10.1.0:1024
  • Sybase ASE 15.5:2000
  • SQL Server 2008:2100

我们也在这里写过博客:

一旦达到这个限制,ControlFlowException就会在查询渲染站点捕获它,在那里它只是用内联的所有绑定值重新渲染 - 这总是有效的(当然,直到你达到查询大小限制,如果有的话)。

我们假设内联绑定值和重复的硬解析在这些情况下是可以的,因为执行计划可以真正与这种高度动态的 SQL 一起重用的机会很小。

于 2015-01-11T07:50:31.667 回答