Using INSERT OUTPUT in a SQL Server Transaction
By: Tim Ford | Updated: 2010-12-13 | Comments (6) | Related: More > T-SQL
Free MSSQLTips Webinar: Development Best Practices for SQL Server
Attend this webinar to learn about development best practices for SQL Server. Andy Warren megosztja a sok éves tapasztalattal, hogy néhány mutatót, hogy mi működött a legjobban neki, és hogyan lehet hasznosítani néhány ezt a tudást.
Probléma
Gyakran találom magam olyan helyzetekben, ahol meg kell, hogy helyezze be a feljegyzések egy asztal, egy set-alapú működés tekert be egy tranzakció, ahol másodlagosan belül ugyanazon ügylet, én spawn-le későbbi szúr be kapcsolatos táblázatokat, ahol meg kell, hogy adja át-a legfontosabb értékeket, melyek az eredmény a kezdeti BESZÚRÁS parancsot. Hála a tranzakció / SQL enhancement SQL Server, ez csak lett sokkal könnyebb, és lehet tenni egy nyilatkozatot… TRIGGER NÉLKÜL!
Solution
a Microsoft SQL Server egyik tranzakció/SQL továbbfejlesztése az INSERT utasítás kimeneti alpontja. Most elfog a feljegyzések egészül ki, keresztül egy nyilatkozatot, HELYEZZE be (szerintem is, hogy képes megragadni a SZEMÉLYAZONOSSÁG oszlop értékei az új sorok) későbbi használat további HELYEZZE be nyilatkozatot a gyermek asztalra, hogy továbbra is fennállnak, referenciális integritás nélkül egy HELYEZZE be a ravaszt.
miért nem csak használja a ravaszt? Ez egy életképes és bevált konstrukció SQL Server, igaz?
a rövid válasz: “igen, az.”A triggerek azonban egyike azoknak a csúnya kis titkoknak,amelyeket az adatbázis tart. Nem ugranak csak úgy rád, és azt mondják: “Itt vagyok!”Vegyük például a problémamegoldás folyamata, döntésképtelen vagy hangolás egy rosszul teljesítő lekérdezés – a ravaszt ül, a háttérben teljesít, mint már kérdeztem, hogy lehet okozza a problémákat, de, hogy menjen át sok ismétléseket keresés tárolt eljárások, illetve ad-hoc T/SQL kódot valószínűleg még abba, hogy fontolja meg egy trigger lőtt adatok módosítása nyelv parancsok (DML) – BETÉTEK, FRISSÍTÉSEK, vagy TÖRLI, amelyek kiegészítik, hogy mit akarsz diagnosztizálni. A triggerek használatát az alkalmazás kódcsomagjában használt ad-hoc T/SQL kód használatával társítom, majd átadom egy SQL Server példánynak a feldolgozás-gyakorlatok elkerülésére.
ezért szeretem azt, amit látok az INSERT-OUTPUT konstrukcióval. Kapsz az előnyeit, hogy képes megragadni a beillesztett értékeket, hogy akkor adja át a másodlagos parancs -, és akkor csomagolja be mindezt egyetlen tranzakció atomicity. Ennek a konstrukciónak a szintaxisa az alábbiakban látható, csak kissé különbözik az ALAPBETÉTES T / SQL parancstól:
INSERT INTO SOME_TABLE>
(
column_list>
)
OUTPUT INSERTED.identity_column> --és más oszlopok SOME_TABLE ha kell
be SOME_OTHER_TABLE>
(
column_list>
)
SELECT
(
column_list
column_list
>
)
forrás: source_table_or_join_of_multiple_tables>
ahol filtering_criteria>
a különbség a szabványos beszúrás utasítás között a kimeneten való felvétel…A vallomásra. Annak érdekében, hogy ezt egyszerűen az eredeti beszúrás utasítás belsejében lévő másodlagos beszúrás – állításnak tekinthesse, amely rögzíti a virtualizált beillesztett táblázat értékeit – ugyanazt a táblázatot, amelyet a trigger használna-egy másodlagos betét feldolgozásához egy másik asztalhoz. Az alábbi példában, valamint az ünnepi szezonnal összhangban tegyük fel, hogy Ön felelős azért, hogy egy kis bérbeadást végezzen a vállalati AdventureWorks irodáiban. Egy jókedvű öreg manót bérelnek fel néhány bolti promócióra, a vállalati politikának megfelelően mindig 90 napos felülvizsgálatot végez minden új bérlő számára. Azt akarjuk, hogy a notifikáció rögzítésre kerüljön, amikor az új bérletet az Emberi Erőforrások további munkája nélkül adják meg. Az alábbi kód bemutatja, hogyan használhatjuk ezt a Beszúrás kimenetet.
használja AdventureWorks;
GO
---hozzon létre Példatáblákat
/*
Megjegyzés, ez nem teljesen normalizált. Egy másik
táblát is felvettem volna az értesítési típusokhoz, ha ez tényleges megoldás lenne.
azt is használja egy int NotificationTypeID oszlop értesítések tábla
helyett varchar (xx) NotificationType oszlop.
* /
SÉMAENGEDÉLYEZÉS létrehozása dbo;
GO
Táblázat létrehozása .
(
IDENTITY (1,1) NOT NULL,
VARCHAR(30) NOT NULL,
VARCHAR(30)NOT NULL,
CONSTRAINT PRIMARY KEY CLUSTERED
(
ASC
) ON
) ON ;
CREATE TABLE .
(
IDENTITÁS(1,1) NEM ÜRES,
NEM ÜRES,
DATETIME NEM ÜRES,
VARCHAR(30), NEM NULL,
KÉNYSZER ELSŐDLEGES KULCS FÜRTÖZÖTT
(
ASC
)A
IS);
Most, hogy már épült a tárgyakat, hogy ez a kis testmozgás nézd meg a BESZÚRÁS-KIMENET konstrukció akcióban…
/*
mutassa be, hogyan helyezheti be a személyzethez hozzáadott kulcsértékeket.StaffID
into Notifications.StaffID in single transaction
* /
INSERT in HR. Staff (FirstName, LastName )
OUTPUT INCLUSED.StaffID, DATEADD(d,90,GETDATE()),'90 napos felülvizsgálat'
A HR.Notification
(
StaffID,
NotificationDate,
NotificationType
)
értékek ( 'Mikulás','Claus');
kiválasztása most mind a személyzet, mind az értesítési táblázatok látni fogja, hogy a legfontosabb értékeket sikeresen beírták mindkét táblázatba:
select * from HR.staff;
select * from HR.Notification;
beszúrás utasítás kimeneti almondata, most van egy nagyon fontos-és meglehetősen korlátozó kikötés az INSERT – OUTPUT használatával kapcsolatban. A kimeneti cél nem lehet része semmilyen külföldi kulcsfontosságú kapcsolatnak. Még akkor is, ha nincs lépcsőzetes kapcsolat bármely más objektummal az adatbázisban lévő kapcsolaton keresztül. Nézzük meg, mi történik, ha igen. Hozzáadunk egy külföldi kulcsot a StaffID értesítéshez, hivatkozva a személyzeti táblázat StaffID oszlopára, majd megpróbálunk hozzáadni néhány további üdülési segítséget:
--Add Foreign Key for StaffID column to Notifications table
ALTER TABLE HR.Notification ADD CONSTRAINT
FOREIGN KEY
(
StaffID
)
referenciák HR.Staff
(
StaffID
);
/*
mutassa be, hogyan helyezheti be a személyzethez hozzáadott kulcsértékeket.StaffID
into Notifications.StaffID in single transaction
* /
INSERT in HR. Staff (FirstName, LastName )
OUTPUT INCLUSED.StaffID, DATEADD (d,90, GETDATE ()),'90 napos felülvizsgálat'
A HR. Notification
(
StaffID,
NotificationDate,
NotificationType
)
értékek ("fagyos", "hóember");
SELECT * FROM HR.Személyzet;
SELECT * FROM HR.Értesítés;
A következő hibaüzenet vissza, mint várták:
Msg 332 16-os SZINT, az Állami 1, Vonal 17
A cél TÁBLÁZAT 'HR.Értesítés a KIMENET A záradék nem lehet mindkét oldalán egy (ELSŐDLEGES KULCS, IDEGEN KULCS) kapcsolat. Talált hivatkozási kényszer "FK_Notification_Staff".
Ez valószínűleg jó ebben az esetben, mivel jó esély van arra, hogy hóember Úr nem lesz 90 nap alatt.
következő lépések
- További információ a kimeneti záradékról
- olvassa el ezt az előző tippet a kimeneti záradékról
- a szerző további tippjei ezen a linken érhetők el.
Utolsó frissítése: 2010-12-13
a szerzőről
tekintse meg az összes tippemet
- további adatbázis-Fejlesztő tippek…