Массовое обновление (обновление или вставка) хранимой процедуры - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь выполнить массовое обновление (обновление или вставку) хранимой процедуры в базу данных сервера SQL, и я использую sequelizer для подключения базы данных сервера SQL с использованием Node js.

Это набор данных от 1 до 50 тыс. Строк. Любая помощь будет принята с благодарностью!

Я пробую это в nodejs с помощью sequelizer

const upsertedData = [
  {
    id: "123",
    value: "Value 2"
  },
  {
    id: "124",
    value: "Value 1"
  }
]

const upsert = async (data) => {
  await sequelize.query(
    `BEGIN
      DECLARE @json NVARCHAR(MAX);
      SET @json = :dataToBeUpserted
      MERGE INTO dbo.tableToBeUpserted AS Target
      USING (SELECT * from OpenJson(@json) WITH (
          id nvarchar(32),
          value nvarchar(32),
      )) AS Source
      ON (Target.id = Source.id)
      WHEN MATCHED THEN
      UPDATE SET 
          Target.value = Source.value
      WHEN NOT MATCHED THEN           
          INSERT (id, value)
          VALUES (Source.id, Source.value);
    END`,
    {
      replacements: {
        dataToBeUpserted: JSON.stringify(data)
      },
    }
  )
}

upsert (upsertedData)

Однако я получаю эту ошибку:

Неправильный синтаксис рядом с ключевым словом with. Если этот оператор является общим табличным выражением, предложением xmlnamespaces или предложением контекста отслеживания изменений, предыдущий оператор должен заканчиваться точкой с запятой.

и я даже пробовал в SQL Server Management Studio:

DECLARE @json NVARCHAR(MAX);
SET @json = N'[
  {"id": 2, "info": {"name": "John", "surname": "Smith"}, "age": 25},
  {"id": 5, "info": {"name": "Jane", "surname": "Smith"}, "dob": "2005-11-04T12:00:00"}
]';

SELECT *
FROM OPENJSON(@json)
  WITH (
    id INT 'strict $.id',
    firstName NVARCHAR(50) '$.info.name',
    lastName NVARCHAR(50) '$.info.surname',
    age INT,
    dateOfBirth DATETIME2 '$.dob'
  );
  

Получение той же ошибки:

Неправильный синтаксис рядом с ключевым словом 'with'. Если этот оператор является общим табличным выражением, предложением xmlnamespaces или предложением контекста отслеживания изменений, предыдущий оператор должен завершаться точкой с запятой.

Пожалуйста, помогите мне решить эту проблему.

1 Ответ

0 голосов
/ 09 июля 2020

До SQL 2016 вы можете использовать формат XML.

Эквивалент OPEN JSON равен OPEN XML

Вы также можете использовать JSON в SQL Server 2014, смотрите следующие статьи:

Потребление JSON строк на SQL сервере

SQL Server JSON в таблицу и таблица в JSON

Создание JSON документов из SQL серверных запросов через T SQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...