目标:我想更新SQL表[dbo.properties]中的现有条目。SQL命令在PHP中执行。PHP文件再次接收一个数组,作为新的数据源。此数组包含唯一的ID、propertyName和实际的值。
问题:在SQL中,如何通过数组循环并确保在正确的点更新值?
我的SQL表看起来像:
[id] as [int] increments by DB
[property] as [varchar(50)]
[value] as [varchar(50)]
传递的数组看起来像:
0: Object {id:'30', property:'sugar', value:'20g'}
1: Object {id:'37', property:'salt', value:'10g'}
2: Object {id:'38', property:'chocolate', value:'120g'}
我知道如何使用单个数据或使用列表删除多个值。但我很难为我的案子找到类似的东西。特别是因为我需要在一个查询中更新所有行,并且行数是动态的。意味着可能只有一项更新或10项。
伪SQL查询以更好地理解
BEGIN TRANSACTION [updateProperties]
BEGIN TRY
UPDATE properties SET
// Somehow iterate through array
property = ('array[Pos][Entry1]'),
value = ('array[Pos][Entry2]')
WHERE id = ('array[Pos][Entry0]')
COMMIT TRANSACTION [updateProperties]
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION [updateProperties]
END CATCH;
如果将其作为一个适当的JSON数组传入,则可以使用OPENJSON
来联接到表
DECLARE @json nvarchar(max) = N'[
{"id":30, "property":"sugar", "value":"20g"},
{"id":37, "property":"salt", "value":"10g"},
{"id":38, "property":"chocolate", "value":"120g"}
]';
UPDATE p
SET property = j.property,
value = j.value
FROM properties p
JOIN OPENJSON(@json)
WITH (
id int,
[property] varchar(50),
[value] varchar(50)
) j ON j.id = p.id;
如果要更新现有行并插入新行,则可以使用MERGE
。
附带说明一下,我建议您不要将value
存储为varchar
。相反,将其拆分为amount
和unit
。