2013-02-15 13 views
6

Próbuję nauczyć się korzystać z operatora MERGE. Poniższy kod kompiluje poprawnie:Jak debugować scalanie w 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 

Jest to bardzo prosta procedura, wiem, ale z jakiegoś powodu nie wydaje się, aby wygenerować żadnych wpisów kiedy użyć następującego polecenia.

Czy jest dla mnie sposób, aby wiedzieć, która z opcji jest podążająca, jeśli w ogóle?


Usunięto poprzednią procedurę przechowywaną.

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; 

Teraz wstawia, aktualizuje i usuwa, a także zwraca dane wyjściowe.

+1

Czy moja odpowiedź nie sugeruje, że nie użyłeś zmiennej '@ LineID'? :) – shahkalpesh

+0

Tak, przepraszam. –

Odpowiedz

10

Można łączyć MERGE a klauzulą ​​OUTPUT dostać jakąś na „sprawozdanie z działalności” (lub debug „instrukcji print”) z co MERGE robi - może to pomoże ci uzyskać zrozumienie dla tego, co się dzieje źle .

Zobacz Adama machanic wspaniałe blogu Dr. OUTPUT or: How I Learned to Stop Worrying and Love the MERGE, który pokazuje, że technika i jak umieścić go używać

Zasadniczo sprowadza się to do korzystania z klauzuli OUTPUT z rachunku MERGE, aby uzyskać informacje o tym, co się dzieje - coś z grubsza zgodnie z:

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

Dziękuję bardzo, teraz wiem jak. –

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

Przepraszam, ponieważ nie używałem MERGE. Jednak nie widzę kodu przy użyciu zmiennej @LineID.