A kimeneti záradék frissítési utasítások
a kimeneti záradék került bevezetésre SQL Server 2005 verzió. A kimeneti záradék Az egyes sorok azon értékeit adja vissza, amelyeket egy beszúrás, frissítés vagy törlés utasítás érintett. Még támogatja az egyesítési nyilatkozatot is, amelyet az SQL Server 2008-ban vezettek be. A kimeneti záradék eredménye a lekérdezés végrehajtása során külön táblázatba illeszthető. Ezt a záradékot leggyakrabban ellenőrzési célra használják. Ezzel valaki végre egy egyéni folyamat, amely működik, mint a CDC, vagy jár ugyanúgy, mint a CDC.
ezenkívül a kimeneti záradék eredményei visszaadhatók a feldolgozó alkalmazásoknak olyan célokra, mint a megerősítő üzenetek, a naplózás vagy bármely más alkalmazáskövetelmény. Ebben a cikkben példákat fogok bemutatni a kimeneti záradék használatának bemutatására a frissített sorok eredményeinek rögzítésében a frissítési nyilatkozatok táblázatváltozójába.
első lépések
az alábbi példák követéséhez létre kell hoznia egy táblázatot Department_SRC az alábbi T-SQL kód végrehajtásával egy SQL Server adatbázisban. A hivatkozott rész tartalmazza Output_Update.sql fájl, amely tartalmazza a T-SQL kódot, hogy próbálja ki az alábbi példákat.
IF OBJECT_ID ('Department_SRC', 'U') IS NOT NULL DROP TABLE dbo.Department_SRC;CREATE TABLE .( IDENTITY(1,1) NOT NULL, varchar(50) NOT NULL, varchar(50) NOT NULL, NOT NULL) ON Insert into .(,,) Values('Engineering','Research and Development',getdate());
a táblázatban láthatja, hogy a rekordot az alábbi képen látható módon illesztették be a táblázatba.
Végre a KIMENETI Záradék a Frissítés Kimutatások
Ahogy megbeszéltük az előző cikkben, a KIMENETI záradékot ad hozzáférést két virtuális táblák (Mágikus Táblák):
- “BESZÚRT” tartalmaz, hogy az új sorok (BESZÚRÁS, vagy UPDATE-be)
- “TÖRÖLT” tartalmaz, a régi példányt a sort(FRISSÍTÉS BEÁLLÍTÁSA)
A KIMENETI záradék a FRISSÍTÉS nyilatkozatot fog férni mind a EGÉSZÜL ki, valamint a TÖRÖLT belső táblákat. Ez azt jelenti, hogy mindkét táblázat a frissítési nyilatkozat végrehajtásával egyidejűleg érhető el. Tegyük fel például, hogy frissítünk néhány oszlopot egy táblázatban egyetlen sorban. Az újonnan frissített értékek a táblázat módosításai, amelyek a beillesztett belső táblázatban találhatók. Ezenkívül a megváltozott adatok a régi adatértékek, amelyeket beillesztenek a törölt belső táblázatba.
frissítési értékek megtekintése
a kimeneti záradék segítségével megjeleníthetjük a frissített értékeket a kimeneti ablakban az oszlopnevek kiválasztásával a beillesztett előtaggal vagy a beillesztett használatával.* a beillesztett táblázat összes oszlopának megjelenítéséhez. Ezenkívül megjeleníthetjük a régi adatértékeket a táblázatból a kimeneti ablakba, ha kiválasztjuk az oszlopneveket törölt előtaggal vagy törölve.* a táblázat összes oszlopának megjelenítéséhez. Ez segít a kimeneti üzenetek némelyikének kinyomtatásában a management studio ablakban is.
annak érdekében, hogy ezt egy példával magyarázzam, végrehajtom az alábbi kódot, amelyben megpróbáljuk frissíteni a csoportnév oszlopot a “kutatás-fejlesztés” értékről a “mérnöki” osztály “IT” értékére.
--Update the GroupName for the Department.Update Set ='IT', ModifiedDate=Getdate()OUTPUT deleted.Name ,deleted.GroupName as GroupName_old, deleted.ModifiedDate as ModifiedDate_old, inserted.GroupName as GroupName_new, inserted.ModifiedDate as ModifiedDate_newWhere ='Engineering'
a fenti kód végrehajtása után láthatjuk a kimeneti záradék eredményét az alábbi képen látható módon.
kimeneti eredmények beillesztése a
táblázat változóba a példa bemutatásához egy @Updated nevű táblázatváltozót deklaráltam, hogy a kimeneti záradék eredményeit ebbe a táblázatváltozóba tároljam. A kimenetet szintaxisba használjuk annak érdekében, hogy az eredményeket egy táblázatváltozóba tároljuk. Ebben a megközelítésben hozzáférhetünk a sorokhoz mind az új, mind a lekérdezés által frissített régi értékek beállításához, amelyek ugyanazon tétel következő lépéseihez használhatók.
--capturing Updated values using table variable.DECLARE @Updated table( int, varchar(50), varchar(50), varchar(50), datetime, datetime);Update Set ='IT', ModifiedDate=Getdate()OUTPUT deleted.DepartmentID, deleted.Name, deleted.GroupName as GroupName_old, inserted.GroupName as GroupName_new, deleted.ModifiedDate as ModifiedDate_old,inserted.ModifiedDate as ModifiedDate_newINTO @UpdatedWhere ='Engineering'--Querying from @Updated output tableSelect * from @Updated
miután végrehajtottuk a fenti kódot, láthatjuk, hogy az eredményeket beillesztettük a @frissített táblázat változóba az alábbi képen látható módon.
kimeneti záradék használata a 3-as típusú lassan változó dimenzió betöltéséhez
a fenti példákkal a kimeneti záradék nagyon jó alternatíva a 3-as típusú dimenziós táblázat betöltéséhez. Annak érdekében, hogy ezt egy példával magyarázzam, végrehajtom az alábbi kódot, amely létrehoz egy 3.típusú dimenziós táblázatot, amelyet Department_Type3-nak hívnak.
---Type 3 table exampleIF OBJECT_ID ('Department_Type3', 'U') IS NOT NULL DROP TABLE dbo.Department_Type3;CREATE TABLE .( IDENTITY(1,1) NOT NULL, varchar(50) NULL, varchar(50) NULL, varchar(50) NULL, NULL) ON GO---Insert some test valuesInsert into .(,,) Values('Engineering','Research and Development',getdate());Select * from .
a fenti kód végrehajtása után láthatjuk a táblázat adatainak eredményét az alábbi képen látható módon.
mivel új rekordot helyezünk be a Department_Type3 táblába, láthatjuk, hogy a GroupName_old oszlop NULL értékkel rendelkezik, a GroupName_Current pedig a legutóbbi betét értékével rendelkezik. Tegyük fel, hogy változás történt a GroupName_current alkalmazásban A” Engineering ” Osztálynévnél, és frissítenünk kell a Department_Type3 táblát az új GroupName_current értékkel. Mivel ez, TYPE3 dimenzió táblázat a követelmény itt az, hogy frissítse a GroupName_old oszlop “kutatás-fejlesztés” és GroupName_Current az új értéket.
--capturing Updated values using table variable.DECLARE @Updated table( int, varchar(50), varchar(50), varchar(50), datetime, datetime);Update Set ='IT', EffectiveDate=Getdate()OUTPUT deleted.DepartmentID, deleted.Name, deleted. as ,inserted.GroupName_current as GroupName_new, deleted.EffectiveDate as ModifiedDate_old,inserted.EffectiveDate as ModifiedDate_newINTO @UpdatedWhere ='Engineering'--Update the GroupName_old with old valuesUpdate aSet a.GroupName_old=b.GroupName_old, a.EffectiveDate=b.ModifiedDate_newfrom as ainner join @Updated as bon a.DepartmentID=b.DepartmentID--Querying the final tableSelect * from
miután végrehajtottuk a fenti kódot, rögzítjük a törölt belső táblázat eredményeit a @frissített táblázat változóba, majd ezeket az adatokat felhasználva frissítjük az utolsó táblázat oszlopait az ilyen típusú 3 lassan változó dimenzió megvalósításához. A végső táblázat adatainak eredményét a fenti utasítás végrehajtása előtt és után láthatjuk, amint az az alábbi képeken látható.
a FRISSÍTÉS Előtt nyilatkozatot végrehajtás
a FRISSÍTÉS Után nyilatkozat végrehajtás
KIMENET Záradék Korlátozások
Némely esetekben, amikor a KIMENETI záradék nem támogatott:
- DML nyilatkozatok, hogy a referencia helyi megosztja véleményét, elosztott megosztja véleményét, vagy a távoli asztal.
- parancsok beszúrása, amelyek végrehajtásra vonatkozó utasítást tartalmaznak.
- a teljes szövegű predikátumok nem engedélyezettek a kimeneti záradékban, ha az adatbázis kompatibilitási szintje 100-ra van állítva.
- a kimeneti záradék nem használható beszúrni egy nézet, vagy rowset funkciót.
- a felhasználó által definiált függvény nem hozható létre, ha olyan kimenetet tartalmaz a záradékba, amelynek céltáblája
a teljes lista ezen a linken szerepel: https://technet.microsoft.com/en-us/library/ms177564(v=sql.110).aspx
összefoglaló
amint az a fenti példákban látható, láthatjuk, hogy a kimeneti záradék könnyen használható, és elkerülheti a sok egyedi kódolást annak érdekében, hogy a frissített értékek kimeneti eredményeit mind a régi, mind az új értékekkel egy táblázatváltozóba rögzítse a lekérdezés végrehajtása során.
Leave a Reply