尝试使用 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)
这指示查询优化器使用完成执行所需的任何深度,不受限制。
性能注意事项
虽然递归方法很简单,但在某些情况下可能会更慢。如需更优化的解决方案,请考虑使用其他方法,例如以下方法:
结论
通过利用级联 CTE 技术或探索替代方法,您可以在 SQL Server 中高效地选择大量行,超过sys.all_columns 表遇到的限制。
以上是如何在 SQL Server 中高效地选择超出 7374 行限制的行?的详细内容。更多信息请关注PHP中文网其他相关文章!