在使用CTE更新临时表时出现的异常行为

编程语言 2026-07-08

数据定义语言(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 会被更新为2,但结果全是1:

在此输入图片描述

解决方案

问题在于 CAST(NULL AS bit) AS CNID_RecordCount

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   --   here
INTO #Tab2And3Pop

应该是:CAST(NULL AS INT),以避免隐式转换。

原理: 位数据类型:

将任意非零值提升为1。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章