嘗試使用ROW_NUMBER 函數從sys.all_columns 表中檢索行時可能會遇到限制。從 7374 行開始,查詢突然終止。這是因為您已達到 sys.all_columns 中可用的最大行數。
用於產生大數字的級聯 CTE
要克服此限制,您可以利用級聯CTE 來建立「數字表」或「計數表」。這種方法被認為是產生連續整數表的最有效方法。以下程式碼片段示範了:
DECLARE @Range AS INT = 7374 ;WITH E1(N) AS( -- 10 ^ 1 = 10 rows SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N) ), E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10 ^ 2 = 100 rows E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10 ^ 4 = 10,000 rows E8(N) AS(SELECT 1 FROM E4 a CROSS JOIN E4 b), -- 10 ^ 8 = 10,000,000 rows CteTally(N) AS( SELECT TOP(@Range) ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) FROM E8 ) SELECT * FROM CteTally
解釋
CTE E1 作為十行的起點。後續 CTE(E2、E4 等)執行交叉聯接,將行數乘以 10。這種級聯方法允許您有效率地產生大量行。
無限遞歸避免
為了防止與最大遞歸相關的錯誤,您可以將最大遞歸深度指定為0 Options 子句:
OPTION (MAXRECURSION 0)
這指示查詢最佳化器使用完成執行所需的任何深度,不受限制。
效能注意事項
雖然遞迴方法很簡單,但在某些情況下可能會較慢。如需更最佳化的解決方案,請考慮使用其他方法,例如以下方法:
結論
透過利用級聯CTE 技術或探索替代方法,您可以在SQL Server 中有效地選擇大量行,超過sys.all_columns 表遇到的限制。
以上是如何在 SQL Server 中有效率地選擇超出 7374 行限制的行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!