2012-06-29 77 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

是的,它看起來像是一個'六個一個半其他'的情況。 –