Re: Insert дубликатов, как лучше? (MS SQL)
От: svanir Украина  
Дата: 05.06.15 11:17
Оценка: 1 (1)
Здравствуйте, rFLY, Вы писали:

FLY>Интересует практика, так что MS это или другой сервак, не важно.

FLY>Задача такая, получить данные с удаленного сервера, и каждую запись дважды (с небольшими изменениями) вставить в таблицу. Как реализовано на данный момент:
FLY>
FLY>;with source as
FLY>(
FLY>    select f1 from [server].[table]
FLY>)
FLY>-- Вставляем первый раз, если в итоговой таблицы нет такой записи (это внутренняя проверка она не относится к вопросу, а просто нуна)
FLY>INSERT INTO destination (f1, f2)
FLY>    OUTPUT INSERTED.f1 INTO @affected (f1)
FLY>SELECT s.f1, 0 as f2 FROM source as s WHERE NOT EXISTS (SELECT NULL FROM destination WHERE f1=s.f1)

FLY>-- Вставляем дубликат с измененным значением по второму полю
FLY>INSERT INTO t (f1, f2) 
FLY>SELECT d.f1, 1 AS f2
FLY>FROM destination as d WHERE EXISTS(SELECT NULL FROM @affected WHERE f1 = d.f1);
FLY>

FLY>Иногда хранимка отваливается по таймауту выполнив только первый инсерт (то есть все записи с f2=0 в destination появляются, а вот с f2=1 нет). А инога за пару секунд все вставляется

спасет обработка транзакции

BEGIN TRY
BEGIN TRAN Ins
-- Вставляем первый раз, если в итоговой таблицы нет такой записи (это внутренняя проверка она не относится к вопросу, а просто нуна)
INSERT INTO destination (f1, f2)
OUTPUT INSERTED.f1 INTO @affected (f1)
SELECT s.f1, 0 as f2 FROM source as s WHERE NOT EXISTS (SELECT NULL FROM destination WHERE f1=s.f1)

-- Вставляем дубликат с измененным значением по второму полю
INSERT INTO t (f1, f2)
SELECT d.f1, 1 AS f2
FROM destination as d WHERE EXISTS(SELECT NULL FROM @affected WHERE f1 = d.f1);
COMMIT TRAN Ins
END TRY
BEGIN CATCH
ROLLBACK TRAN Ins
END CATCH
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.