在 SQL Server 中,可以使用 ROW_NUMBER() 函數來選擇特定的行數。但是,可以傳回的行數有限制。
提供的初始查詢未指定從中選取行的特定表。當對 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);
透過使用數字表,可以產生無限數量的行。然而,這種方法可能相對較慢。
為了提高效能,可以使用級聯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中文網其他相關文章!