Я пытаюсь использовать команду MERGE
для вставки и обновления некоторых данных в таблице. В таблице есть уникальный ключ, так что команда обновления должна выполнить перед вставкой, иначе она не удастся из-за нарушения уникального ключа. Эта операция слияния также выполняется в контексте транзакции, которая также выполняет другие запросы.Слияние: порядок эффектов
Вот общий план запроса:
MERGE [dbo].[MyTable] AS Target
USING #temp AS Source ON Target.[id] = Source.[id]
WHEN MATCHED THEN
UPDATE ...
WHEN NOT MATCHED THEN
INSERT ...
Моя проблема заключается в том, что при запуске запроса он бросает ошибку за нарушение уникального ключа. Надеюсь, что предложение update запускается первым, но похоже, что это не происходит.
Может ли кто-нибудь подтвердить порядок исполнения, и если я могу что-то сделать, чтобы исправить это?
Я бы предположил, что заказ - это любой порядок, который имеет источник. Вы можете попробовать упорядочить источник с помощью чего-то вроде 'CASE WHEN EXISTS (SELECT 1 FROM [dbo]. [MyTable] m WHERE m. [Id] = Source. [Id]) THEN 0 ELSE 1 END', хотя, честно говоря, t знать, будет ли SQL Server соблюдать этот порядок на протяжении всего слияния. Также не уверен, что это безопасно (вот почему это комментарий, а не ответ). – hatchet