У меня есть таблица предметов, как это выглядит.
ItemsTbl
id -PK
BrandId- int (FK)
LocationId- int (FK)
Field3 - nvarchar(Max) Json string containing a jsonKey called itemNumber
Сейчас я создаю импортер (берет файл Excel), который будет массово импортировать 1000 элементов за раз. Но прежде чем я смогу вставить их, я должен проверить, существуют ли они в базе данных.
Если это так, обновите, если не новую запись.
В идеальном мире, я бы хотел, чтобы клиент имел в своем файле excel поле с уникальным номером (через свой pk в БД или что-то еще) и сохранил его в моем БД. Если он совпадает с тем, что есть в нашей базе данных, обновите его, иначе он новый.
Мне сказали, что это невозможно, так как они думают, что 90% клиентской базы не смогут выяснить, как дать нам файл с уникальным столбцом для использования в качестве идентификатора.
Я также не могу заново создать файл с уникальными номерами, поскольку, как мне сказали, большинство будет обновлять список каждый раз, когда решат импортировать.
Таким образом, новая идея состоит в том, чтобы в базе данных появился новый столбец, который будет объединять BrandId + LocationId + itemNumber
, а затем каждый раз, когда файл проходит, объединять эти 3 поля из файла Excel и выполнять проверку.
Я обеспокоен тем, что это поле не синхронизируется, как будто они вручную входят в нашу систему и изменяют любое из этих 3 полей, которые поле должно было бы изменить.
Полагаю, триггер был бы лучшим, чтобы остановить это, но я не уверен, возможно ли иметь триггер в поле, содержащем json.
Я использую EF Core, Sql Server 2017.
Причина, по которой я не пытаюсь сделать что-то подобное
select * from ItemsTbl where BrandId = 1 AND LocationId = 1 And JSON_VALUE('Field3',$.itemNumber) = 12345
потому что, как я уже сказал, я получаю 1000 предметов одновременно, я не хочу делать 1000 отдельных запросов. Я скорее делаю 1 запрос с предложением in
, затем перебираю результаты и обновляю.