Articles

clauza de ieșire pentru instrucțiuni de actualizare

clauza de ieșire a fost introdusă în versiunea SQL Server 2005. Clauza de ieșire returnează valorile fiecărui rând care a fost afectat de un INSERT, UPDATE sau DELETE declarații. Aceasta susține chiar instrucțiunea MERGE, care a fost introdus în SQL Server 2008. Rezultatul din clauza de ieșire poate fi inserat într-un tabel separat în timpul executării interogării. Această clauză este cel mai frecvent utilizată în scopul auditului. Prin utilizarea acestui cineva poate implementa un proces personalizat care ar funcționa ca CDC, sau să acționeze în același mod ca CDC.

în plus, rezultatele din clauza de ieșire pot fi returnate la cererile de procesare pentru a fi utilizate în lucruri cum ar fi mesajele de confirmare, logare și orice alte cerințe de aplicare. În acest articol, voi oferi un set de exemple pentru a prezenta utilizarea clauzei de ieșire în captarea rezultatelor rândurilor actualizate într-o variabilă de tabel pentru instrucțiunile de actualizare.

Noțiuni de bază

pentru a urma exemplele de mai jos, va trebui să creați un tabel Department_SRC executând codul T-SQL de mai jos într-o bază de date SQL Server. Secțiunea de referință conține Output_Update.fișier sql, care include codul T-SQL pentru a încerca exemplele de mai jos.

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());

puteți vedea în datele din tabel că înregistrarea a fost inserată în tabel așa cum se arată în imaginea de mai jos.

implementați Clauza de ieșire în instrucțiunile de actualizare

așa cum am discutat în articolul meu anterior, clauza de ieșire oferă acces la două tabele virtuale (tabele magice):

  1. „INSERATED” conține noua clauză de rânduri (set insert sau update)
  2. „deleted” conține copia veche a rândurilor(set update)

clauza de ieșire cu o instrucțiune update va avea acces atât la tabelele interne inserate, cât și la cele șterse. Aceasta înseamnă că ambele tabele sunt accesibile în același timp de executare a instrucțiunii de actualizare. De exemplu, să presupunem că actualizăm câteva coloane dintr-un tabel pentru un singur rând. Valorile recent actualizate sunt modificările aduse tabelului și se află în tabelul intern inserat. În plus, datele care au fost modificate sunt valorile vechi de date și sunt inserate în tabelul intern șters.

vizualizarea valorilor de actualizare

folosind clauza de ieșire, putem afișa valorile actualizate în fereastra de ieșire selectând numele coloanelor cu prefixul introdus sau folosind inserat.* pentru a afișa toate coloanele din tabelul introdus. În plus, putem afișa valorile vechi de date din tabel în fereastra de ieșire selectând numele coloanelor cu prefix șters sau folosind șters.* pentru a afișa toate coloanele din acel tabel. Acest lucru va ajuta, de asemenea, la imprimarea unora dintre mesajele de ieșire din fereastra Studio de management.

pentru a explica acest lucru cu un exemplu, execut codul de mai jos, în care încercăm să actualizăm coloana GroupName de la valoarea „cercetare și dezvoltare” la valoarea „IT” pentru departamentul „Inginerie”.

--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'

odată ce executăm codul de mai sus, putem vedea rezultatul clauzei de ieșire așa cum se arată în imaginea de mai jos.

inserarea rezultatelor de ieșire într-o variabilă de tabel

pentru a prezenta acest exemplu, am declarat o variabilă de tabel numită @Updated pentru a stoca rezultatele clauzei de ieșire în această variabilă de tabel. Folosim ieșirea în sintaxă pentru a stoca rezultatele într-o variabilă de tabel. În această abordare, avem acces pentru a seta rânduri atât valorile noi, cât și valorile vechi care au fost actualizate de interogare, care pot fi utilizate pentru următorii pași din același lot.

--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

odată ce executăm codul de mai sus, putem vedea că rezultatele au fost inserate în variabila tabelului @actualizat așa cum se arată în imaginea de mai jos.

utilizarea clauzei de ieșire pentru a încărca o dimensiune de tip 3 care se schimbă încet

cu exemplele prezentate mai sus, clauza de ieșire este o alternativă foarte bună pentru a încărca un tabel de dimensiuni de tip 3. Pentru a explica acest lucru cu un exemplu, execut codul de mai jos, care va crea un tabel de dimensiune de tip 3 numit Department_Type3.

---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 .

odată ce executăm codul de mai sus, putem vedea rezultatul datelor din tabel așa cum se arată în imaginea de mai jos.

pe măsură ce introducem o nouă înregistrare în tabelul Department_Type3, putem vedea că coloana GroupName_old are o valoare nulă și GroupName_Current are valoarea inserției recente. Să presupunem că a existat o schimbare în GroupName_current pentru numele departamentului „inginerie” și trebuie să actualizăm tabelul Department_Type3 cu noua valoare GroupName_current. Deoarece aceasta este, un tabel de dimensiuni TYPE3 cerința aici este de a actualiza coloana GroupName_old cu „Cercetare și dezvoltare” și GroupName_Current cu noua valoare.

--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 

odată ce executăm codul de mai sus, vom captura rezultatele din tabelul intern șters în variabila @Updated table și apoi vom folosi aceste date pentru a actualiza coloanele tabelului final pentru implementarea acestui tip 3 modificând lent dimensiunea. Putem vedea rezultatul datelor din tabelul final înainte și după executarea instrucțiunii de mai sus, așa cum se arată în imaginile de mai jos.

înainte de executarea Declarației de actualizare

după executarea Declarației de actualizare

limitări Clauza de ieșire

unele dintre scenariile în care clauza de ieșire nu este acceptată:

  1. declarații DML care trimit vizualizări partiționate locale, vizualizări partiționate distribuite sau tabele la distanță.
  2. introduceți instrucțiuni care conțin o instrucțiune EXECUTE.
  3. predicatele Full-text nu sunt permise în clauza de ieșire atunci când nivelul de compatibilitate a bazei de date este setat la 100.
  4. ieșire în clauza nu poate fi folosit pentru a insera într-o vizualizare, sau funcția rowset.
  5. o funcție definită de utilizator nu poate fi creată dacă conține o clauză OUTPUT INTO care are ca țintă un tabel

lista completă este listată în acest link:https://technet.microsoft.com/en-us/library/ms177564(V=sql.110).aspx

rezumat

după cum se arată în exemplele de mai sus, putem vedea că clauza de ieșire este ușor de utilizat și poate evita mulțime de codificare personalizat, în scopul de a capta rezultatele de ieșire ale valorilor actualizate cu ambele valori vechi și noi într-o variabilă de tabel în timpul executării interogării.