首頁 >資料庫 >mysql教程 >如何在 SQL Server 中有效率地選擇超出 7374 行限制的行?

如何在 SQL Server 中有效率地選擇超出 7374 行限制的行?

Patricia Arquette
Patricia Arquette原創
2024-12-30 20:26:19572瀏覽

How to Efficiently Select Rows in SQL Server Beyond the 7374 Row Limit?

在SQL Server 中選擇行:處理超過7374 行的大數

嘗試使用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)

這指示查詢最佳化器使用完成執行所需的任何深度,不受限制。

效能注意事項

雖然遞迴方法很簡單,但在某些情況下可能會較慢。如需更最佳化的解決方案,請考慮使用其他方法,例如以下方法:

  • NUMERIC_TABLE() 函數(Azure SQL 資料庫和SQL Server 2022 及更高版本)
  • 遞歸預存程序(SQL Server 2000 及更高版本)
  • 具有種子和增量的識別列(SQL Server 2005 年及以後)

結論

透過利用級聯CTE 技術或探索替代方法,您可以在SQL Server 中有效地選擇大量行,超過sys.all_columns 表遇到的限制。

以上是如何在 SQL Server 中有效率地選擇超出 7374 行限制的行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn