Здравствуйте, 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