Массовое удаление и вставка

#sql #sql-server #sql-server-2005

#sql #sql-сервер #sql-server-2005

Вопрос:

Я пытаюсь создать скрипт, который проверяет, существует ли регистр, если он существует, он удаляет его и вставляет новый с обновленными данными. Я создаю сценарий с помощью программы, которая копирует файл с одного NAS на другой, и это довольно просто.

Пока что мой код создает скрипт с этими строками:

 IF EXISTS (SELECT TOP 1 iDRegister FROM Documents WHERE iDRegister= 123456) BEGIN
    DELETE FROM Documents WHERE iDRegister= 123456
END
INSERT INTO Documents (iDRegister, idAPP, idDocType, Batch, BatchUploadDate, UploadDate, Route, idNas, Memo, NroMemo, DocID, ClientID, Folio, PolicyNum, CardNum, ProposalNum, RequirementNum, SolicitacionNum, AuditNum, RejectNum, SentMemo, OccurNum, StampDate, CompanyFund, IsMemo)
VALUES (123456, 10, 1, '1', CONVERT(VARCHAR(50), GETDATE(), 120), '20190416', 'Routeimage.TIF', 1, '11111', '', '111111111', '', '11111111111111', '', '', '', '', '', '', '', '', '', '', '', 'NO')
 

Это работает отлично, но я должен сделать то же самое для 2,2 миллионов регистров. Могу ли я каким-либо образом удалить предыдущий регистр, если он существует, а затем использовать массовую вставку?

Ответ №1:

Можете ли вы UPDATE вместо этого?

 UPDATE D
SET D.Field = D.NewValue
FROM Documents D
JOIN tableWithIDsToUpdate T ON D.iDRegister = T.iDRegister
 

Вы все равно можете захотеть выполнять пакетную рассылку обновлений, чтобы не выполнять 2,2 миллиона одновременно.

Редактировать

Поскольку вам также необходимо INSERT обновить несуществующие строки, вы можете следовать приведенному выше с помощью этого:

 INSERT INTO Documents (col1, col2, etc)
SELECT col1, col2, etc
FROM tableWithIDsToUpdate T
LEFT JOIN Documents D ON D.iDRegister = T.idRegister
WHERE D.idRegister IS NULL
 

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

1. Из-за характера проекта, которым я занимаюсь, я не могу позволить себе время обновлять их небольшими партиями за раз. Кроме того, существуют не все регистры, поэтому, чтобы сделать его универсальным, я ставлю условие, что если он существует, я удаляю его, в противном случае я просто вставляю его

2. @Throkar Почему? По сути, вы все равно обновляете запись. Вы удаляете его и вставляете новый. Это не только будет невероятно неэффективным при изменении записи, но и значительно увеличит ваши журналы SQL.

3. Поскольку я автоматически генерирую свой скрипт в программе, я не могу отфильтровать тех, у кого уже есть регистр.

4. И OT, но две вещи, которые меня беспокоят. Во-первых, SQL 2005 является древним . Игнорируя тот факт, что 4 версии SQL Server после него вот-вот достигнут EOL, вы увидите некоторые значительные улучшения производительности при обновлении до более современной версии. Во-вторых, я вижу столбец IsMemo , в который вставляется строка. Похоже, что это должно быть логическое значение, что также улучшит вашу производительность (и требования к хранилищу).

5. Я знаю, что SQL 2005 довольно старый, к сожалению, мне не нужно его обновлять. Что касается столбца IsMemo, он уже был определен ранее, когда я получил проект.