如何生成连续序号并填充到SQL临时表,上限为另一张表row字段最大值
解决方案
方案1:递归CTE实现(兼容SQL Server 2008及以上版本)
适用于绝大多数常用SQL Server版本,无需依赖高版本特性:
DECLARE @reportTable TABLE (row int, [1] nvarchar(max), [2] nvarchar(max)) -- 先获取序列上限值 DECLARE @MaxRow INT SELECT @MaxRow = MAX(row) FROM @Days -- 递归生成1到@MaxRow的连续整数序列 ;WITH NumCTE AS ( SELECT 1 AS row UNION ALL SELECT row + 1 FROM NumCTE WHERE row < @MaxRow ) INSERT INTO @reportTable (row, [1], [2]) SELECT row, '', '' FROM NumCTE -- 序列长度超过100时需加下列参数解除递归层数默认限制 OPTION (MAXRECURSION 0)
方案2:内置函数实现(仅支持SQL Server 2022、Azure SQL等新高版本)
直接调用官方内置序列生成函数,代码更简洁性能更优:
DECLARE @reportTable TABLE (row int, [1] nvarchar(max), [2] nvarchar(max)) -- 先获取序列上限值 DECLARE @MaxRow INT SELECT @MaxRow = MAX(row) FROM @Days INSERT INTO @reportTable (row, [1], [2]) SELECT value, '', '' FROM GENERATE_SERIES(1, @MaxRow)
注意事项
- 两种方案均无需依赖@Days表的完整序列,仅取其row字段最大值作为生成上限,完全规避原表断号问题
- 递归CTE方案中如果确定最大序列长度不超过100,可以删除最后的
OPTION (MAXRECURSION 0)语句
内容的提问来源于stack exchange,提问作者ranto1
相关产品推荐
相关产品推荐

