如何在SQL子查询中实现变量@c的自增?
解决方案
在你的SQL查询中,直接使用变量@c无法实现逐行自增——因为SELECT语句是批量处理的,变量赋值会在整个查询执行完成后才生效,导致所有<ul>标签的id都会是inputState0。
要实现每个分组(或每行)生成唯一的递增ID,你可以用**窗口函数ROW_NUMBER()**来替代变量@c,它能为查询结果的每一行生成一个连续的序号。
修改后的完整SQL代码
DECLARE @technicalProperty nvarchar(max)='' SET @technicalProperty+= ( SELECT '<div class="col-12 ms-3 ms-md-0 mt-3"> <label for="inputState" class="form-label">'+ec_with_rn.Title+':</label> <ul class="" id="inputState'+CAST(rn as nvarchar(max))+'"> '+STUFF( ( SELECT ' <li class="btn btn-outline-dark me-3 my-1" data-spec1="'+CAST(dy.categoryParentID as nvarchar(max))+'" data-spec2="'+CAST(dy.CategoryChildID as nvarchar(max))+'" data-oldproid="'+CAST(@current_CommodityNServicePropertyID as nvarchar(max))+'" style="width:120px;">'+dy.childTitle+'</li>' FROM #dynamicTbl dy WHERE dy.CategoryParentID = ec_with_rn.categoryParentID FOR XML PATH(''),TYPE ).value('.','NVARCHAR(MAX)'),1,1,'') +'</ul></div>' FROM ( -- 内层查询添加ROW_NUMBER()生成递增序号 SELECT DISTINCT ec.categoryParentID, ec.Title, ROW_NUMBER() OVER(ORDER BY ec.categoryParentID) AS rn -- 可按需调整排序字段 FROM CnSTechnicalSpecification sc LEFT JOIN categoryParent ec on ec.categoryParentID=sc.categoryParentID WHERE CategoryChildID=@ChildID and ec.categoryParentID!=3 ) AS ec_with_rn FOR XML PATH(''),TYPE ).value('.','nvarchar(max)')
关键说明
- 新增内层子查询
ec_with_rn,用ROW_NUMBER() OVER(ORDER BY ec.categoryParentID)生成从1开始的连续序号rn,你可以根据实际需求修改ORDER BY的字段(比如按ec.Title排序),确保序号生成符合业务逻辑。 - 移除原变量
@c,直接用rn替换到<ul>的id属性中,这样每个分组对应的<ul>都会得到唯一的inputState1、inputState2...格式的ID。 - 原查询中的
DISTINCT保留在内层子查询中,避免重复分组生成重复序号。
内容的提问来源于stack exchange,提问作者Mohadeseh
相关产品推荐
相关产品推荐

