SQL Server 2008中用CTE将同ID旧记录更新为0的问题求助
解决SQL更新旧记录时的列无效错误
嗨,我来帮你搞定这个问题!你遇到的错误207是因为原来的CTE定义有两个小问题,咱们一步步修正:
问题出在哪?
- CTE里没包含要更新的列:你原来的CTE只返回了
RN这个序号列,当你尝试更新valido时,SQL找不到这个列,自然报错“列无效”。 - 分区逻辑不合理:你把
valido加入了PARTITION BY,但这个列是你要修改的目标,而且默认值都是1,这样分区会把所有valido=1的记录混在一起,没法准确区分同一用户的新旧记录。
修正后的代码
;WITH cte AS ( SELECT id_gen, perpro, valido, -- 只按用户唯一标识分区,按ini降序排,最新记录RN=1 ROW_NUMBER() OVER ( PARTITION BY id_gen, perpro ORDER BY ini DESC ) AS RN FROM tstSolap ) UPDATE cte SET valido = 0 WHERE RN > 1; -- 把同一用户下除最新记录外的旧记录标记为0
代码说明
- 我把
valido从分区条件里去掉了,改成只按id_gen和perpro分区,这样能保证同一用户的所有记录都在同一个分组里排序,准确找到最新的那条记录(RN=1)。 - CTE里现在包含了
valido列和用户标识列,SQL能识别到要更新的列,就不会再报207错误了。 - 最后只更新
RN>1的行,也就是同一用户下的旧记录,完美实现你标记新旧记录的需求。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

