如何通过查询结果更新列:将ResultingStrings数据同步至ContourTemp
把ResultingStrings更新到ContourTemp列的解决方案
嘿,你已经搞定了生成目标JSON字符串的查询逻辑,现在只需要把它整合到UPDATE语句里就能完成数据迁移啦!这里有两种实用的写法,你可以根据习惯选择:
方法1:用UPDATE...FROM直接赋值(SQL Server推荐写法)
这种方式最直接,把你生成ResultingStrings的子查询直接放到SET语句里,同时保留原有的关联条件确保更新正确的行:
UPDATE dc SET dc.ContourTemp = ( SELECT JSON_QUERY('{"Ksize":9,"Treshold1":50,"Treshold2":100,"Size1":100,"Size2":250}') as CalculationParameters, 'CalculateWithCSharp' as CalculationProvider, (SELECT X1, Y1, X2, Y2 FROM SimpleLines WHERE ContourId = dc.ContourId FOR JSON AUTO) AS SimpleLines FOR JSON PATH, WITHOUT_ARRAY_WRAPPER ) FROM DbContours dc INNER JOIN [dbo].Measurements m ON dc.ContourId = m.MeasurementId;
小提示:
如果某个ContourId在SimpleLines里没有对应数据,生成的SimpleLines字段会是null。要是你想让它显示为空数组[],可以用ISNULL处理一下:
ISNULL((SELECT X1, Y1, X2, Y2 FROM SimpleLines WHERE ContourId = dc.ContourId FOR JSON AUTO), '[]') AS SimpleLines
方法2:先查再更的子查询方式
要是你更习惯先把结果查出来再关联更新,也可以这么写:
UPDATE DbContours SET ContourTemp = rs.ResultingStrings FROM ( -- 这里复用你原有的查询逻辑,只保留需要的ResultingStrings和ContourId SELECT ( SELECT JSON_QUERY('{"Ksize":9,"Treshold1":50,"Treshold2":100,"Size1":100,"Size2":250}') as CalculationParameters, 'CalculateWithCSharp' as CalculationProvider, (SELECT X1, Y1, X2, Y2 FROM SimpleLines WHERE ContourId = dc.ContourId FOR JSON AUTO) AS SimpleLines FOR JSON PATH, WITHOUT_ARRAY_WRAPPER ) AS ResultingStrings, dc.ContourId FROM DbContours dc INNER JOIN [dbo].Measurements ON dc.ContourId = [dbo].Measurements.MeasurementId ) rs WHERE DbContours.ContourId = rs.ContourId;
必看注意事项
- 先验证再更新:执行UPDATE前,一定要先跑一遍原有的SELECT查询,确认ResultingStrings的内容完全符合预期,最好先备份一下
DbContours表,避免误操作。 - 字段类型要匹配:确保
ContourTemp是NVARCHAR(MAX)或者足够长的字符串类型,不然JSON内容可能会被截断哦。 - 大数据量优化:如果表里面数据很多,记得检查
ContourId、MeasurementId这些关联字段有没有建索引,必要的话可以分批更新,避免锁表影响性能。
内容的提问来源于stack exchange,提问作者Fallingsappy
相关产品推荐
相关产品推荐

