2014-05-21 1 views
0

Я пытаюсь использовать команду 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 запускается первым, но похоже, что это не происходит.

Может ли кто-нибудь подтвердить порядок исполнения, и если я могу что-то сделать, чтобы исправить это?

+0

Я бы предположил, что заказ - это любой порядок, который имеет источник. Вы можете попробовать упорядочить источник с помощью чего-то вроде 'CASE WHEN EXISTS (SELECT 1 FROM [dbo]. [MyTable] m WHERE m. [Id] = Source. [Id]) THEN 0 ELSE 1 END', хотя, честно говоря, t знать, будет ли SQL Server соблюдать этот порядок на протяжении всего слияния. Также не уверен, что это безопасно (вот почему это комментарий, а не ответ). – hatchet

ответ

2

Избегайте использования Merge заявление, я хотел бы использовать два отдельных UPDATE и INSERT заявление, чтобы сделать эти операции, что-то вроде этого ....

UPDATE

UPDATE MT 
SET MT.Col1 = T.Col1 
    ,MT.Col2 = T.Col2 
    ,MT.Col3 = T.Col3 
FROM [MyTable] MT INNER JOIN #temp t 
ON MT.[id] = T.[id] 

ВСТАВИТЬ

INSERT INTO [MyTable] (ID, Col1, Col2, Col3) 
SELECT t.ID, t.Col1, t.Col2, t.Col3 
FROM #temp t 
WHERE NOT EXISTS (SELECT 1 
        FROM [MyTable] 
        WHERE ID = t.ID) 

Зачем избегать MERGE

Прочитайте эту статью по Aaron BertrandUse Caution with SQL Server's MERGE Statement

После прочтения этой статьи вы узнаете, это нарушение уникального ключа является Infact Активной ошибки в Merge заявлении. Лучше держаться подальше от Merge :)

Смежные вопросы