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

如何使用无关联的另一张临时表中的值更新表(替换NEWID())

如何使用无关联的另一张临时表中的值更新表(替换NEWID())

看起来你是想把原本用NEWID()生成的随机GUID,换成从临时表#tmpGUIDs里预先生成的GUID值,但两个表没有直接的关联键对吧?其实这个问题很好解决——我们只需要给要更新的目标行和临时表的GUID行分别加上「顺序标识」,然后通过这个标识来匹配更新就可以了。

核心思路

因为两张表没有天然的关联字段,我们就手动给它们加一个「行号」作为临时关联键:

  1. 给@List中需要更新的行(NewFlag=1的行)生成连续的行号
  2. 给#tmpGUIDs里的GUID行也生成对应的连续行号(如果你的临时表已经有连续的rnum,这一步可以简化)
  3. 通过行号关联两张表,完成更新

具体实现代码

情况1:#tmpGUIDs的rnum已经是连续的(从1开始)

如果你的临时表#tmpGUIDs里的rnum是从1开始的连续整数,直接用下面的语句即可:

WITH TargetRows AS (
    SELECT 
        NewKey,
        -- 这里的ORDER BY可以根据你的需求调整,比如按原表的ID、创建时间排序,确保更新顺序符合预期
        -- 如果没有特定顺序要求,用(SELECT NULL)即可生成任意顺序的行号
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rnum
    FROM @List
    WHERE NewFlag = 1
)
UPDATE TargetRows
SET NewKey = tmp.uuid
FROM TargetRows tr
JOIN #tmpGUIDs tmp ON tr.rnum = tmp.rnum;

情况2:#tmpGUIDs的rnum不连续或不是从1开始

如果你的临时表rnum不是连续的,我们可以先给它重新生成连续的行号,再进行关联:

WITH TargetRows AS (
    SELECT 
        NewKey,
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rnum
    FROM @List
    WHERE NewFlag = 1
),
OrderedGUIDs AS (
    SELECT 
        uuid,
        -- 按临时表原有的rnum排序,生成新的连续行号
        ROW_NUMBER() OVER (ORDER BY rnum) AS rnum
    FROM #tmpGUIDs
)
UPDATE TargetRows
SET NewKey = og.uuid
FROM TargetRows tr
JOIN OrderedGUIDs og ON tr.rnum = og.rnum;

重要注意事项

  • 数量匹配:一定要确保#tmpGUIDs里的GUID数量 ≥ @List中NewFlag=1的行数,否则会有部分行无法被更新(因为找不到匹配的行)
  • 排序可控:如果需要更新的行和GUID有特定的对应顺序,一定要在ROW_NUMBER()的ORDER BY子句里指定具体的列(比如原表的主键、创建时间),不要用(SELECT NULL),否则匹配顺序是不可控的
  • 重复检查:如果#tmpGUIDs里的uuid有重复,更新后目标表的NewKey也会出现重复,记得提前确保临时表的GUID是唯一的

备注:内容来源于stack exchange,提问作者ZedZip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 11:44:31