OUTPUT dla INSERT, UPDATE i DELETE w SQL Server

lechert

SQL Server od wersji 2005 oferuje nowe rozszerzenie OUTPUT. Instrukcja może być przydatna w przypadkach konieczności zachowania danych archiwalnych powstających w wyniku wykonywania poleceń INSERT, UPDATE, DELETE. Rozwiązanie prezentowane w przykładzie może być alternatywą dla rozwiązań wykorzystujących triggery.

Definiujemy przykładową tabelę

CREATE TABLE Artykul 
( 
  id    int, 
  Nazwa varchar(30),
  Cena  decimal(10,2)

)

-- Dane dla tabeli

INSERT INTO Artykul VALUES
(
 1, 'BMW Z3', 9000.99
)


INSERT INTO Artykul VALUES
(
 2, 'BMW Z4', 19000.99
)

INSERT INTO Artykul VALUES
(
 3, 'Audi A4', 11000.99
)


DECLARE @Artykul TABLE 
(
 ID     INT,
 Nazwa  VARCHAR(20),
 Cena   DECIMAL(6,2)
)
INSERT INTO @Artykul VALUES
(
 1, 'BMW Z3', 9000.99
)

INSERT INTO @Artykul VALUES
(
 2, 'BMW Z4', 19000.99
)

INSERT INTO @Artykul VALUES
(
 3, 'Audi A4', 11000.99
)

-- Przykład korzystania z OUTPUT dla instrukcji INSERT

DECLARE @ArtikelArchiv TABLE 
(
 ID           INT,
 Name         VARCHAR(20),
 Price        DECIMAL(6,2),
 ModifiedBy   SYSNAME,
 ModifiedDate DATETIME
)

INSERT INTO @Artikel (ID, Name, Price)
OUTPUT 
 inserted.ID,
 inserted.Name,
 inserted.Price,
 SUSER.SNAME(),
 GETDATE()
 INTO @ArtikelArchiv
VALUES
(
  1111, 'Audi A6', 14000
)

SELECT * FROM @Artikel
SELECT * FROM @ArtikelArchiv

-- Przykład korzystania z OUTPUT dla instrukcji UPDATE

DECLARE @ArtikelArchiv TABLE 
(
 Price        DECIMAL(6,2),
 OldPrice     DECIMAL(6,2),
 ModifiedBy   SYSNAME,
 ModifiedDate DATETIME
)

UPDATE @Artikel
 SET Price = Price * 1.1
OUTPUT 
 deleted.Price,
 inserted.Price,
 SUSER.SNAME(),
 GETDATE()
INTO @ArtikelArchiv
WHERE ID = 1234
 
SELECT * FROM @Artikel
SELECT * FROM @ArtikelArchiv

-- Przykład korzystania z OUTPUT dla instrukcji DELETE

DECLARE @ArtikelArchiv TABLE 
(
 OldID        INT,
 ModifiedBy   SYSNAME,
 ModifiedDate DATETIME
)

DELETE FROM @Artikel
OUTPUT
 deleted.ID,
 SUSER.SNAME(),
 GETDATE()
INTO @ArtikelArchiv
WHERE ID = 1234

SELECT * FROM @Artikel
SELECT * FROM @ArtikelArchiv

0 komentarzy