обновите строки SQL с многомерным массивом в качестве источника

#sql #arrays #sql-server

Вопрос:

Цель: Я хочу обновить существующие записи в моей таблице SQL [dbo.properties]. Команда SQL выполняется на PHP. PHP-файл снова получает массив в качестве нового источника данных. Этот массив содержит уникальный идентификатор, имя свойства и фактическое значение.

Проблема: Как мне выполнить цикл в 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;  

Комментарии:

1. Это похоже на JSON; если это так, то SQL Server поддерживает JSON с SQL Server 2016. Используете ли вы поддерживаемую версию SQL Sevrer?

2. Я использую SQL Server 2019.

3. Затем, предполагая, что это JSON, взгляните на OPENJSON .

4. @Larnu как это помогает мне выполнять цикл в инструкции update? Я json_encode массив, на самом деле для лучшего формата. Все равно спасибо за ваш вклад, Ларну.

5. Значит, это не JSON? SQL Server не имеет типа данных массива, так как же вы тогда отправляете указанные данные на SQL Server? Если это не JSON, возможно, вам действительно нужен параметр типа таблицы. Похоже, что подразделение на самом деле должно включать сведения о том, какой язык программирования вы тоже используете, поскольку массив не имеет контекста с точки зрения SQL Server; в T-SQL нет такого понятия, как массив.

Ответ №1:

Если вы передадите это как правильный массив 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 .