2013-02-15 3 views
6

Я пытаюсь узнать, как использовать оператор MERGE. Следующий код компилирует правильно:Как отлаживать слияние в SQL Server?

ALTER PROCEDURE moto.procPM_UpdateLines 
@LineId As Int = null, 
@LineName As Varchar(100), 
@DeleteMe As Bit = 0 
    AS 
    BEGIN 

    MERGE moto.tblPMLine AS line 
    USING (SELECT LineId, LineName FROM moto.tblPMLine) AS existsLine 
    ON line.LineId = existsLine.LineId 
    WHEN MATCHED AND @DeleteMe = 1 THEN DELETE 
    WHEN MATCHED AND @DeleteMe = 0 THEN UPDATE SET line.LineName = @LineName 
    WHEN NOT MATCHED THEN INSERT(LineName) VALUES(@LineName); 
    END 
    GO 

Это очень простая процедура, я знаю, но почему-то, кажется, не создает никаких записей, когда я использую следующую команду.

execute moto.procPM_UpdateLines null, 'First test', 0 

Есть ли способ узнать, какой из вариантов он следует, если вообще?


Предыдущая хранимая процедура исправлена.

MERGE INTO moto.tblPMLine AS T 
    USING (SELECT @LineId as LineId, @LineName as LineName) AS S 
    ON T.LineId = S.LineId 
    WHEN MATCHED AND @DeleteMe = 0 THEN --UPDATE 
     UPDATE SET LineName = @LineName 
    WHEN MATCHED AND @DeleteMe = 1 THEN --DELETE 
     DELETE 
    WHEN NOT MATCHED THEN--INSERT 
     INSERT (LineName) VALUES (@LineName)  
    OUTPUT $action AS ChangesMade; 

Теперь он вставляет, обновляет и удаляет, а также возвращает выход.

+1

Не подсказывает ли мой ответ, что вы не использовали переменную '@ LineID'? :) – shahkalpesh

+0

Да, извините. –

ответ

10

Вы можете комбинировать MERGE и пункт OUTPUT, чтобы получить какое-то «отчет о деятельности» (или отлаживать «заявление печати») того, что MERGE делает - возможно, это поможет вам получить понимание, что происходит не так , отличный блог

знакомства Адам Machanic в Dr. OUTPUT or: How I Learned to Stop Worrying and Love the MERGE, который показывает, что метод и как его использовать

В основном это сводится к тому, с помощью предложения OUTPUT с MERGE заявление, чтобы получить информацию о том, что происходит - что-то около по линиям:

MERGE INTO ...... 
WHEN MATCHED THEN 
    ....... 
WHEN NOT MATCHED THEN 
    ...... 
WHEN NOT MATCHED BY SOURCE THEN 
    ........ 
OUTPUT 
    $action AS dml_action, 
    inserted.x AS new_x, 
    deleted.x AS old_x, 
    inserted.y AS new_y, 
    deleted.y AS old_y; 
+0

Большое спасибо, теперь я знаю как. –

1
MERGE moto.tblPMLine AS line 
USING (SELECT LineId, LineName FROM moto.tblPMLine WHERE LineID = @LineID) AS existsLine 

Простите меня, как я не использовал MERGE. Тем не менее, я не вижу код с использованием переменной @LineID.

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