Articles

OUTPUTKLAUSULEN for OPDATERINGSERKLÆRINGER

OUTPUTKLAUSULEN blev introduceret i version 2005. OUTPUTKLAUSULEN returnerer værdierne for hver række, der blev påvirket af et Indsæt, Opdater eller slet udsagn. Det understøtter endda MERGE-erklæringen, som blev introduceret i Server 2008. Resultatet fra OUTPUTKLAUSULEN kan indsættes i en separat tabel under udførelsen af forespørgslen. Denne klausul bruges mest til revisionsformål. Ved at bruge dette kan nogen implementere en brugerdefineret proces, der fungerer som CDC, eller handle på samme måde som CDC.

derudover kan resultaterne fra OUTPUTKLAUSULEN returneres til behandlingsapplikationerne til brug i ting som bekræftelsesmeddelelser, logning og andre applikationskrav. I denne artikel vil jeg give et sæt eksempler til at fremvise brugen af OUTPUTKLAUSUL til at fange resultaterne af de opdaterede rækker i en tabelvariabel for OPDATERINGSERKLÆRINGERNE.

Kom godt i gang

for at følge nedenstående eksempler skal du oprette en Tabelafdeling_src ved at udføre nedenstående t-SKL-kode i en SKL-Serverdatabase. Det refererede afsnit indeholder Output_Update.denne fil indeholder koden til at afprøve nedenstående eksempler.

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

Du kan se i tabeldataene, at posten er indsat i tabellen som vist på nedenstående billede.

Implementer OUTPUTKLAUSULEN i Opdateringserklæringer

som vi diskuterede i min tidligere artikel, giver OUTPUTKLAUSULEN adgang til to virtuelle tabeller (magiske tabeller):

  1. “indsat” indeholder den nye rækker (Indsæt eller opdateringssæt)
  2. “slettet” indeholder den gamle kopi af rækkerne(opdateringssæt)

Outputklausulen med en opdateringserklæring har adgang til både de indsatte og slettede interne tabeller. Det betyder, at begge disse tabeller er tilgængelige på samme tid, når OPDATERINGSERKLÆRINGEN udføres. Antag f.eks., at vi opdaterer et par kolonner i en tabel for en enkelt række. De nyligt opdaterede værdier er ændringerne i tabellen og er i den indsatte interne tabel. Derudover er de data, der er ændret, de gamle dataværdier og indsættes i den slettede interne tabel.

visning af Opdateringsværdier

Ved hjælp af OUTPUTKLAUSULEN kan vi vise de opdaterede værdier i outputvinduet ved at vælge kolonnenavne med det indsatte præfiks eller ved hjælp af indsat.* for at vise alle kolonnerne fra den indsatte tabel. Derudover kan vi vise de gamle dataværdier fra tabellen i outputvinduet ved at vælge kolonnenavne med slettet præfiks eller ved hjælp af slettet.* for at vise alle kolonnerne fra denne tabel. Dette vil også hjælpe med at udskrive nogle af outputmeddelelserne i vinduet management studio.

for at forklare dette med et eksempel udfører jeg nedenstående kode, hvor vi forsøger at opdatere GroupName-kolonnen fra “Research and Development” – værdien til “IT” – værdien for “Engineering” – afdelingen.

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

Når vi har udført ovenstående kode, kan vi se resultatet af OUTPUTKLAUSULEN som vist i nedenstående billede.

indsættelse af OUTPUTRESULTATER i en Tabelvariabel

for at fremvise dette eksempel erklærede jeg en tabelvariabel kaldet @opdateret for at gemme resultaterne af OUTPUTKLAUSULEN i denne tabelvariabel. Vi bruger OUTPUT i syntaks for at gemme resultaterne i en tabelvariabel. I denne tilgang har vi adgang til at indstille rækker både de nye værdier og gamle værdier, der er blevet opdateret af forespørgslen, som kan bruges til de næste trin i samme batch.

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

Når vi har udført ovenstående kode, kan vi se, at resultaterne er indsat i den @opdaterede tabelvariabel som vist i nedenstående billede.

brug af OUTPUTKLAUSUL til at indlæse en type 3 langsomt skiftende Dimension

med ovenstående viste eksempler er OUTPUTKLAUSULEN et meget godt alternativ til at indlæse en type 3 dimensionstabel. For at forklare dette med et eksempel udfører jeg nedenstående kode, som vil oprette en tabel af type 3 dimension kaldet 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 .

Når vi har udført ovenstående kode, kan vi se resultatet af tabeldataene som vist i nedenstående billede.

da vi indsætter en ny post i Department_Type3-tabellen, kan vi se, at groupname_old-kolonnen har en NULL-værdi, og GroupName_Current har værdien af den seneste indsats. Lad os antage, at der var ændring i GroupName_current for “Engineering” Afdelingsnavnet, og vi skal opdatere Department_Type3-tabellen med den nye GroupName_current-værdi. Da dette er en Type3-dimensionstabel, er kravet her at opdatere groupname_old-kolonnen med “forskning og udvikling” og GroupName_Current med den nye værdi.

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

Når vi har udført ovenstående kode, fanger vi resultaterne fra den slettede interne tabel i den @opdaterede tabelvariabel og bruger derefter disse data til at opdatere final table-kolonnerne til implementering af denne type 3 langsomt skiftende dimension. Vi kan se resultatet af de endelige tabeldata før og efter udførelsen af ovenstående erklæring som vist på nedenstående billeder.

før udførelsen af opdateringserklæringen

efter udførelsen af OPDATERINGSERKLÆRINGEN

OUTPUTKLAUSULBEGRÆNSNINGER

nogle af scenarierne, hvor OUTPUTKLAUSULEN ikke understøttes:

  1. DML-udsagn, der refererer til lokale partitionerede visninger, distribuerede partitionerede visninger eller eksterne tabeller.
  2. indsæt udsagn, der indeholder en EKSEKVERINGSERKLÆRING.
  3. fuldtekstprædikater er ikke tilladt i OUTPUTKLAUSULEN, når databasekompatibilitetsniveauet er indstillet til 100.
  4. OUTPUT INTO-klausulen kan ikke bruges til at indsætte i en visning eller rækkesæt-funktion.
  5. en brugerdefineret funktion kan ikke oprettes, hvis den indeholder et OUTPUT i klausul, der har en tabel som mål

den fulde liste er angivet i dette link:https://technet.microsoft.com/en-us/library/ms177564(V=kvm.110).som vist i ovenstående eksempler kan vi se, at OUTPUTKLAUSULEN er nem at bruge og kan undgå mange brugerdefinerede kodninger for at fange outputresultaterne af opdaterede værdier med både Gamle og nye værdier i en tabelvariabel under udførelsen af forespørgslen.