UTGÅNGSKLAUSULEN för UPPDATERINGSUTTALANDEN
utgångsklausulen introducerades i SQL Server 2005-versionen. Output-satsen returnerar värdena för varje rad som påverkades av en infoga, uppdatera eller ta bort uttalanden. Det stöder även MERGE-uttalandet, som introducerades i SQL Server 2008. Resultatet från utgångsklausulen kan infogas i en separat tabell under utförandet av frågan. Denna klausul används oftast för revisionssyfte. Genom att använda detta kan någon implementera en anpassad process som skulle fungera som CDC, eller agera på samma sätt som CDC.
dessutom kan resultaten från utgångsklausulen returneras till bearbetningsapplikationerna för användning i sådana saker som bekräftelsemeddelanden, loggning och andra applikationskrav. I den här artikeln kommer jag att ge en uppsättning exempel för att visa användningen av output-klausulen för att fånga resultaten av de uppdaterade raderna i en tabellvariabel för UPPDATERINGSUTTALANDENA.
komma igång
för att följa nedanstående exempel måste du skapa en Tabellavdelning_src genom att köra nedanstående T-SQL-kod i en SQL Server-databas. Det refererade avsnittet innehåller Output_Update.sql-fil, som innehåller T-SQL-koden för att prova nedanstående exempel.
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 tabelldata att posten har infogats i tabellen som visas i bilden nedan.
implementera Utgångsklausulen i Uppdateringsuttalanden
som vi diskuterade i min tidigare artikel ger utgångsklausulen tillgång till två virtuella tabeller (magiska tabeller):
- ”infogad” innehåller den nya rader (insert eller update ’ s set)
- ”deleted” innehåller den gamla kopian av raderna(update ’ s set)
utgångsklausulen med ett uppdateringsuttalande har tillgång till både de infogade och raderade interna tabellerna. Det betyder att båda dessa tabeller är tillgängliga samtidigt som UPPDATERINGSUTTALANDET körs. Anta till exempel att vi uppdaterar några kolumner i en tabell för en enda rad. De nyligen uppdaterade värdena är ändringarna i tabellen och finns i den infogade interna tabellen. Dessutom är de data som har ändrats de gamla datavärdena och infogas i den borttagna interna tabellen.
Visa Uppdateringsvärden
med UTGÅNGSKLAUSULEN kan vi visa de uppdaterade värdena i utmatningsfönstret genom att välja kolumnnamnen med det infogade prefixet eller använda infogade.* för att visa alla kolumner från den infogade tabellen. Dessutom kan vi visa de gamla datavärdena från tabellen i utmatningsfönstret genom att välja kolumnnamnen med raderat prefix eller använda DELETED.* för att visa alla kolumner från den tabellen. Detta hjälper också till att skriva ut några av utmatningsmeddelandena i fönstret management studio.
för att förklara detta med ett exempel kör jag nedanstående kod, där vi försöker uppdatera kolumnen gruppnamn från värdet ”forskning och utveckling” till ”IT” – värdet för avdelningen ”teknik”.
--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 kör ovanstående kod kan vi se resultatet av UTGÅNGSKLAUSULEN som visas i bilden nedan.
infoga utgångsresultat i en Tabellvariabel
För att visa upp detta exempel förklarade jag en tabellvariabel som heter @uppdaterad för att lagra resultaten från OUTPUT-klausulen i denna tabellvariabel. Vi använder utdata i syntax för att lagra resultaten i en tabellvariabel. I detta tillvägagångssätt har vi tillgång till att ställa in rader både de nya värdena och gamla värden som har uppdaterats av frågan, som kan användas för nästa steg i samma sats.
--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 kör ovanstående kod kan vi se att resultaten har infogats i @Uppdaterad tabellvariabel som visas i bilden nedan.
användning av output-klausulen för att ladda en typ 3 långsamt föränderlig Dimension
med ovanstående exempel är OUTPUT-klausulen ett mycket bra alternativ för att ladda en typ 3-dimensionstabell. För att förklara detta med ett exempel kör jag nedanstående kod, som kommer att skapa en tabell med typ 3-dimension som heter 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 kör ovanstående kod kan vi se resultatet av tabelldata som visas i bilden nedan.
När vi sätter in en ny post i Avdelning_type3-tabellen kan vi se att kolumnen GroupName_old har ett NULL-värde och GroupName_Current har värdet för den senaste insatsen. Låt oss anta att det var förändring i GroupName_current för Avdelningsnamnet ”Engineering” och vi måste uppdatera Avdelning_type3-tabellen med det nya GroupName_current-värdet. Eftersom detta är en typ3 dimensionstabell är kravet här att uppdatera kolumnen GroupName_old med ”forskning och utveckling” och GroupName_Current med det nya värdet.
--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 kör ovanstående kod kommer vi att fånga resultaten från den borttagna interna tabellen i @Uppdaterad tabellvariabel och sedan använda dessa data för att uppdatera finalbordskolumnerna för att implementera denna typ 3 långsamt föränderliga dimension. Vi kan se resultatet av finaltabelldata före och efter utförandet av ovanstående uttalande som visas i bilderna nedan.
innan uppdateringen uttalande utförande
OUTPUT Klausul begränsningar
några av de scenarier där output klausulen inte stöds:
- DML-uttalanden som refererar till lokala partitionerade vyer, distribuerade partitionerade vyer eller fjärrtabeller.
- infoga uttalanden som innehåller en exekvera uttalande.
- predikat i fulltext är inte tillåtna i Output-satsen när databaskompatibilitetsnivån är inställd på 100.
- OUTPUT INTO-satsen kan inte användas för att infoga funktionen view eller rowset.
- en användardefinierad funktion kan inte skapas om den innehåller en OUTPUT in-klausul som har en tabell som mål
den fullständiga listan listas i den här länken:https://technet.microsoft.com/en-us/library/ms177564 (v=sql.110).aspx
sammanfattning
som visas i ovanstående exempel kan vi se att utgångsklausulen är enkel att använda och kan undvika mycket anpassad kodning för att fånga utmatningsresultaten för uppdaterade värden med både gamla och nya värden i en tabellvariabel under utförandet av frågan.
Leave a Reply