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

使用CTE更新临时表异常:CNID_RecordCount未按预期更新为2

临时表更新后字段值不符合预期

DDL代码

IF OBJECT_ID('tempdb..#Tab2And3Pop')  is not null
DROP TABLE #Tab2And3Pop;

SELECT     CAST(115704   AS INT) AS ConflictNoticeID
     , CAST(16003573 AS INT) AS MerchantID
     , CAST(13       AS INT) AS WebUserID
     , CAST(NULL     AS bit) AS CNID_RecordCount
INTO #Tab2And3Pop
UNION SELECT 115704, 16003573, 356459, NULL
UNION SELECT 129110, 6140405 , 28    , NULL
UNION SELECT 129110, 6140405 , 251787, NULL
UNION SELECT 134799, 14868652, 30    , NULL
UNION SELECT 134799, 14868652, 251787, NULL;

--------------------------------------

;with RecordCount AS (
    select ConflictNoticeID, COUNT(*) AS CountOfCNID
    from #Tab2And3Pop
    GROUP BY ConflictNoticeID
)
update p
SET p.CNID_RecordCount = rc.CountOfCNID
--select *
from #Tab2And3Pop p
    JOIN RecordCount RC on rc.ConflictNoticeID = p.ConflictNoticeID

执行上述代码后,预期临时表中CNID_RecordCount字段会被更新为每个ConflictNoticeID对应的记录数2,但实际所有记录的该字段值均为1:
结果截图


问题原因

CNID_RecordCount字段被定义为bit类型,SQL Server中bit类型仅能存储0或1。当你将大于1的数值(此处为2)赋值给bit字段时,SQL Server会自动将其转换为1,因此所有记录的该字段值都显示为1。

解决方法

将CNID_RecordCount的字段类型从bit改为int,修改后的DDL对应行如下:

SELECT     CAST(115704   AS INT) AS ConflictNoticeID
     , CAST(16003573 AS INT) AS MerchantID
     , CAST(13       AS INT) AS WebUserID
     , CAST(NULL     AS INT) AS CNID_RecordCount  -- 此处将bit改为INT
INTO #Tab2And3Pop

重新执行完整代码后,CNID_RecordCount字段会正确显示每个ConflictNoticeID对应的记录数2。

内容的提问来源于stack exchange,提问作者Jeff.Clark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 13:13:10