首页 >数据库 >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