Articles

Output-Klausulen FOR OPPDATERINGS Setninger

output-klausulen ble introdusert I SQL Server 2005-versjonen. OUTPUT-setningsdelen returnerer verdiene for hver rad som ble påvirket av EN INSERT, UPDATE eller DELETE-setning. DEN støtter OGSÅ MERGE-setningen, som ble introdusert I SQL Server 2008. Resultatet FRA OUTPUT-klausulen kan settes inn i et eget bord under utførelsen av spørringen. Denne klausulen brukes mest til revisjonsformål. Ved å bruke dette kan noen implementere en tilpasset prosess som vil fungere SOM CDC, eller handle på samme måte som CDC.

i tillegg kan resultatene fra OUTPUT-klausulen returneres til behandlingssøknadene for bruk i slike ting som bekreftelsesmeldinger, logging og andre søknadskrav. I denne artikkelen vil jeg gi et sett med eksempler for å vise frem bruken AV OUTPUT-klausul i å fange resultatene av de oppdaterte radene i en tabellvariabel FOR OPPDATERINGSUTTALELSENE.

Komme I Gang

for å følge eksemplene nedenfor må du opprette en tabellavdeling_src ved å utføre t-SQL-koden nedenfor i EN SQL Server-Database. Den Refererte delen inneholder Output_Update.sql-fil, som inkluderer T-SQL-koden for å prøve ut eksemplene nedenfor.

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 tabelldataene at posten er satt inn i tabellen som vist på bildet nedenfor.

Implementere OUTPUT-Klausulen I Oppdaterings Setninger

SOM vi diskuterte i min forrige artikkel, GIR output-klausulen tilgang til to virtuelle tabeller (Magiske Tabeller):

  1. «INSERTED» inneholder den nye rader (sett inn eller oppdater)
  2. «slettet» inneholder den gamle kopien av radene(oppdateringssett)

Output-klausulen med en oppdateringserklæring vil ha tilgang til både de innsatte og slettede interne tabellene. Det betyr at begge disse tabellene er tilgjengelige samtidig for å utføre UPDATE-setningen. Anta for eksempel at vi oppdaterer noen kolonner i et bord for en enkelt rad. De nylig oppdaterte verdiene er endringene i tabellen og er I DEN INNSATTE interne tabellen. I tillegg er dataene som er endret, de gamle dataverdiene og settes inn I DEN SLETTEDE interne tabellen.

Vise Oppdateringsverdier

Ved HJELP AV OUTPUT-klausulen kan vi vise de oppdaterte verdiene i utdatavinduet ved å velge kolonnenavnene MED DET INNSATTE prefikset eller BRUKE SATT inn.* for å vise alle kolonnene FRA DEN INNSATTE tabellen. I tillegg kan vi vise de gamle dataverdiene fra tabellen i utdatavinduet ved å velge kolonnenavnene MED SLETTET prefiks eller BRUKE SLETTET.* for å vise alle kolonnene fra tabellen. Dette vil også bidra til å skrive ut noen av utdatameldingene i vinduet management studio.

for å forklare dette med et eksempel, utfører jeg koden nedenfor, der vi prøver å oppdatere Gruppenavn-kolonnen fra» Forskning og Utvikling «- verdien til » IT «- verdien for» Engineering » – avdelingen.

--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 utført koden ovenfor, kan vi se resultatet av UTGANGSKLAUSULEN som vist på bildet nedenfor.

Sette INN UTDATARESULTATER i En Tabellvariabel

for å vise frem dette eksemplet erklærte jeg en tabellvariabel kalt @Oppdatert for å lagre resultatene av UTGANGSKLAUSULEN i denne tabellvariabelen. VI bruker UTGANGEN TIL syntaks for a lagre resultatene i en tabellvariabel. I denne tilnærmingen har vi tilgang til å angi rader både de nye verdiene og gamle verdiene som er oppdatert av spørringen, som kan brukes til de neste trinnene 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 utført koden ovenfor, kan vi se at resultatene er satt inn i @Oppdatert tabellvariabel som vist på bildet nedenfor.

Bruk AV OUTPUT-Klausul For Å Laste INN EN Type 3 Sakte Skiftende Dimensjon

MED eksemplene ovenfor er OUTPUT-klausulen et veldig godt alternativ for å laste INN EN type 3 dimensjonstabell. For å forklare dette med et eksempel, utfører jeg koden nedenfor, som vil lage en tabell AV type 3 dimensjon kalt 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 utført koden ovenfor, kan vi se resultatet av tabelldataene som vist på bildet nedenfor.

når vi setter inn en ny post i Avdeling_type3-tabellen, kan Vi se At GroupName_old-kolonnen har EN NULLVERDI og GroupName_Current har verdien av den siste innsatsen. La oss anta at Det var endring I GroupName_current For» Engineering » Avdelingsnavn, og vi må oppdatere Department_Type3-tabellen med den nye groupname_current-verdien. Siden dette er, en type3 dimensjon tabellen kravet her er å oppdatere Kolonnen GroupName_old med «Forskning Og Utvikling» Og GroupName_Current med den nye verdien.

--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 utført koden ovenfor, vil vi fange resultatene fra DEN SLETTEDE interne tabellen i den Oppdaterte tabellvariabelen og deretter bruke dataene til å oppdatere finalebordet kolonner for å implementere DENNE type 3 sakte skiftende dimensjon. Vi kan se resultatet av finalebordet data før og etter gjennomføring av ovennevnte uttalelse som vist i bildene nedenfor.

før OPPDATERINGEN setningen kjøring

etter OPPDATERINGEN setningen kjøring

OUTPUT Klausul Begrensninger

noen av scenariene der OUTPUT klausulen ikke støttes:

  1. dml-setninger som refererer til lokale partisjonerte visninger, distribuerte partisjonerte visninger eller eksterne tabeller.
  2. SETT inn setninger som inneholder EN EXECUTE-setning.
  3. predikater I fulltekst er ikke tillatt i output-setningsdelen når databasekompatibilitetsnivået er satt til 100.
  4. OUTPUT INTO-setningsdelen kan ikke brukes til å sette inn i en visning eller radsettfunksjon.
  5. En brukerdefinert funksjon kan ikke opprettes hvis den inneholder EN OUTPUT INTO-klausul som har en tabell som mål

hele listen er oppført i denne lenken:https://technet.microsoft.com/en-us/library/ms177564(v=sql.110).aspx

Sammendrag

som vist i eksemplene ovenfor kan vi se AT OUTPUT-klausulen er enkel å bruke og kan unngå mye tilpasset koding for å fange utdataresultatene av oppdaterte verdier med både gamle og nye verdier i en tabellvariabel under utførelsen av spørringen.