首页 > 数据库 > mysql教程 > 如何在 SQL Server 中高效选择特定数量的行,甚至超出 sys.all_columns 限制?

如何在 SQL Server 中高效选择特定数量的行,甚至超出 sys.all_columns 限制?

Barbara Streisand
发布: 2024-12-28 16:13:05
原创
773 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板