基于非唯一列更新SQL Server中NULL行的统一GUID
高效解决SQL Server中按分组更新GUID的问题
针对你需要将dbo.Products表中Product_Ref_Id为NULL的记录,按Product_Name统一更新GUID(同一名称对应同一GUID)的需求,无需循环的高效方案如下:
核心实现代码
WITH ProductGuids AS ( SELECT Product_Name, NEWID() AS New_Guid FROM dbo.Products WHERE Product_Ref_Id IS NULL GROUP BY Product_Name ) UPDATE p SET p.Product_Ref_Id = pg.New_Guid FROM dbo.Products p INNER JOIN ProductGuids pg ON p.Product_Name = pg.Product_Name WHERE p.Product_Ref_Id IS NULL;
代码说明
- CTE预生成分组GUID:通过CTE
ProductGuids筛选出所有Product_Ref_Id为NULL的记录,按Product_Name分组后为每个组生成唯一的GUID(NEWID()),确保同一名称对应同一个GUID。 - 关联更新原表:将原表与CTE通过
Product_Name关联,仅更新原表中Product_Ref_Id为NULL的记录,把对应分组的GUID批量写入。
额外注意事项
- 如果
Product_Name存在大小写不一致、首尾空格等情况,可以通过统一格式化字段来保证分组准确性,例如修改CTE和关联条件:WITH ProductGuids AS ( SELECT LOWER(LTRIM(RTRIM(Product_Name))) AS Formatted_Name, NEWID() AS New_Guid FROM dbo.Products WHERE Product_Ref_Id IS NULL GROUP BY LOWER(LTRIM(RTRIM(Product_Name))) ) UPDATE p SET p.Product_Ref_Id = pg.New_Guid FROM dbo.Products p INNER JOIN ProductGuids pg ON LOWER(LTRIM(RTRIM(p.Product_Name))) = pg.Formatted_Name WHERE p.Product_Ref_Id IS NULL; - 该方案采用SQL集合操作,避免了循环迭代的低效问题,同时绕开了直接在UPDATE中使用GROUP BY的语法限制。
内容的提问来源于stack exchange,提问作者Viswa
相关产品推荐
相关产品推荐

