首頁 > 資料庫 > mysql教程 > 如何在 SQL Server 中有效率地選擇特定數量的行,甚至超出 sys.all_columns 限制?

如何在 SQL Server 中有效率地選擇特定數量的行,甚至超出 sys.all_columns 限制?

Barbara Streisand
發布: 2024-12-28 16:13:05
原創
774 人瀏覽過

How Can I Efficiently Select a Specific Number of Rows in SQL Server, Even Beyond the sys.all_columns Limit?

在 SQL Server 中選擇指定的行數

在 SQL Server 中,可以使用 ROW_NUMBER() 函數來選擇特定的行數。但是,可以傳回的行數有限制。

Sys.Columns 限制

提供的初始查詢未指定從中選取行的特定表。當對 sys.all_columns 執行此查詢時,它最多只會傳回 7374 行,因為這是該表中的總行數。

替代方法

選擇更多行數,可以用替代方法:

使用數字表:

DECLARE @start INT = 1;
DECLARE @end INT = 10;

WITH numbers AS (
    SELECT @start AS number
    UNION ALL
    SELECT number + 1 
    FROM  numbers
    WHERE number < @end
)
SELECT *
FROM numbers
OPTION (MAXRECURSION 0);
登入後複製

透過使用數字表,可以產生無限數量的行。然而,這種方法可能相對較慢。

Tally Table 的級聯CTE

為了提高效能,可以使用級聯CTE 建立Tally Table:

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
登入後複製

這種方法能夠產生大量零讀取的方法行。有關計數表的更多性能比較和其他詳細信息,請參閱響應中提供的連結。

以上是如何在 SQL Server 中有效率地選擇特定數量的行,甚至超出 sys.all_columns 限制?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板