Merge – Transact SQL

Wstawianie (insert), aktualizowanie (update) oraz usuwanie (delete) danych za pomocą jednego polecenia.

Posiadasz tabelę z danymi, do której chcesz dodawać nowe rekordy, aktualizować stare i od czasu do czasu usuwać wybrane rekordy na podstawie określonego zestawu danych. Możesz zatem napisać trzy polecenia: insert, update i delete. Takie rozwiązanie wymaga trzykrotnego wykonania. Od wersji 2008 możesz je zastąpić poleceniem Merge.

Budowa rozwiązania

Tworzenie tabeli docelowej do przeprowadzenia testu.

Tabela składa się z dwóch kolumn: col1 i col2. Napisz skrypt:

if object_id(‚t3’, ‚T’) is not null

drop table t3;

create table t3 (col1 int, col2 varchar(10));

Tworzenie procedury z użyciem Merge

A teraz stwórz procedurę wykorzystującą merge w celu wstawienie danych oraz ich modyfikacji. Procedura ma dwie zmienne. Napisz kod:

create procedure dbo.mergeProc

–deklarowanie zmiennych

 @col1 int, @col2 varchar(10)

as

begin

set nocount on;
merge

–określenie tabeli docelowe

t3 as target

–określenie źródła danych

using (select @col1, @col2) as source (col1, col2)

–określenie złączenia

on (target.col1 = source.col1)

–określenie co ma być zrobione jeśli są rekordy pasujące

when matched then

update set col2 = source.col2

–określenie co ma być zrobione jeśli brak rekordów pasujących

when not matched then

insert (col1, col2) values(col1, col2);

–zakończenie procedury

end

Sprawdzenie działania procedury z użyciem Merge

A teraz wywołaj utworzoną procedurę dodając jeden wiersz danych. Tabele nie zawiera rekordów, zatem powinna być wykonana instrukcja insert. Napisz kod:

exec dbo.mergeProc 1, ‚Ewa’

Sprawdź zawartość tabeli wpisując:

select * from t3;

Otrzymasz:

Sprawdź teraz czy działanie update. Napisz kod:

exec dbo.mergeProc 1, ‚Adam’

W tabeli jest już wartość 1 w col1, a zatem imię Ewa powinno zostać zamieniona na Adam.

Sprawdź wpisując:

select * from t3;

Otrzymasz:

Jak widać działa poprawnie.

Dodaj teraz nowy rekord wpisując:

exec dbo.mergeProc 2, ‚Ewa’;

I sprawdź zawartość tabeli wpisując:

select * from t3;

Otrzymasz:

W następnym kroku, już samodzielnie dodaj do procedury polecenie delete.

Odpowiedz

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>