You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server 2008中用CTE将同ID旧记录更新为0的问题求助

解决SQL更新旧记录时的列无效错误

嗨,我来帮你搞定这个问题!你遇到的错误207是因为原来的CTE定义有两个小问题,咱们一步步修正:

问题出在哪?

  1. CTE里没包含要更新的列:你原来的CTE只返回了RN这个序号列,当你尝试更新valido时,SQL找不到这个列,自然报错“列无效”。
  2. 分区逻辑不合理:你把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:46:24