在 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中文网其他相关文章!