výstupní klauzule pro příkazy aktualizace
výstupní klauzule byla zavedena ve verzi SQL Server 2005. Výstupní klauzule vrací hodnoty každého řádku, který byl ovlivněn příkazy INSERT, UPDATE nebo DELETE. Podporuje dokonce příkaz MERGE, který byl představen v SQL Server 2008. Výsledek z výstupní klauzule lze během provádění dotazu vložit do samostatné tabulky. Tato klauzule se nejčastěji používá pro účely auditu. Pomocí tohoto může někdo implementovat vlastní proces, který by fungoval jako CDC, nebo jednat stejným způsobem jako CDC.
kromě toho mohou být výsledky z výstupní klauzule vráceny do zpracovatelských aplikací pro použití v takových věcech, jako jsou potvrzovací zprávy, protokolování a jakékoli další požadavky na aplikaci. V tomto článku uvedu řadu příkladů, které předvedou použití výstupní klauzule při zachycení výsledků aktualizovaných řádků do proměnné tabulky pro příkazy aktualizace.
Začínáme
Chcete-li sledovat níže uvedené příklady, budete muset vytvořit tabulku Department_SRC spuštěním níže uvedeného kódu T-SQL v databázi serveru SQL. Odkazovaná část obsahuje Output_Update.soubor sql, který obsahuje kód T-SQL pro vyzkoušení níže uvedených příkladů.
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());
můžete vidět v tabulce dat, že záznam byl vložen do tabulky, jak je znázorněno na obrázku níže.
Provádění VÝSTUPNÍ Klauzule v Update Prohlášení,
Jak jsme diskutovali v předchozím článku, VÝSTUPNÍ klauzule dává přístup ke dvěma virtuální tabulky (Magic Tabulky):
- „VKLÁDAJÍ slova“ obsahuje nové řádky (INSERT nebo UPDATE je NASTAVEN)
- „SMAZANÉ“ obsahuje staré kopie řádků(AKTUALIZACE je NASTAVENA)
VÝSTUPNÍ klauzule příkazu UPDATE bude mít přístup k oběma VLOŽENÉ a ODSTRANĚNÉ vnitřní stoly. To znamená, že obě tyto tabulky jsou přístupné současně s provedením příkazu aktualizace. Předpokládejme například, že aktualizujeme několik sloupců v tabulce pro jeden řádek. Nově aktualizované hodnoty jsou změny v tabulce a jsou ve Vložené interní tabulce. Kromě toho jsou data, která byla změněna, staré hodnoty dat a jsou vloženy do odstraněné interní tabulky.
Prohlížení Aktualizovat Hodnoty
Pomocí VÝSTUPNÍ klauzule, můžeme zobrazovat aktuální hodnoty v okně výstup výběrem názvy sloupců s VLOŽENÝM prefixem nebo pomocí VLOŽENÉ.* zobrazení všech sloupců z vložené tabulky. Kromě toho můžeme zobrazit staré hodnoty dat z tabulky do výstupního okna výběrem názvy sloupců se ZRUŠUJE prefix nebo pomocí ODSTRANĚNY.* Chcete-li zobrazit všechny sloupce z této tabulky. To také pomůže při tisku některých výstupních zpráv v okně Studio správy.
abychom to vysvětlili na příkladu, provádím níže uvedený kód, ve kterém se snažíme aktualizovat sloupec Název skupiny z hodnoty „výzkum a vývoj“ na hodnotu „IT“ pro oddělení „inženýrství“.
--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'
jakmile provedeme výše uvedený kód, můžeme vidět výsledek výstupní klauzule, jak je znázorněno na obrázku níže.
Vkládání Výsledků do Tabulky Proměnné
s cílem předvést tento příklad, jsem prohlásil, tabulka proměnné s názvem @Aktualizováno ukládat výsledky VÝSTUPNÍ klauzule do této proměnné tabulka. Výstup používáme do syntaxe, abychom výsledky uložili do proměnné tabulky. V tomto přístupu máme přístup k nastavení řádků jak nové hodnoty, tak staré hodnoty, které byly dotazem aktualizovány, které lze použít pro další kroky ve stejné dávce.
--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
Jakmile jsme se spustit výše uvedený kód, můžeme vidět, že výsledky byly vloženy do @Aktualizovaná tabulka proměnné, jak je znázorněno na obrázku níže.
Použití VÝSTUPNÍ Klauzule, chcete-li Načíst TYP 3 Pomalu Mění Rozměr
S výše uvedeny příklady, VÝSTUPNÍ klauzule je velmi dobrou alternativou k zatížení TYP 3 tabulka rozměrů. Abych to vysvětlil na příkladu, provádím níže uvedený kód, který vytvoří tabulku dimenze typu 3 nazvanou 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 .
jakmile provedeme výše uvedený kód, můžeme vidět výsledek dat tabulky, jak je znázorněno na obrázku níže.
Jak jsme se vložení nového záznamu do Department_Type3 tabulky, můžeme vidět, že GroupName_old sloupec má hodnotu NULL a GroupName_Current má hodnotu posledních vložit. Předpokládejme, že došlo ke změně v GroupName_current pro název oddělení“ Engineering “ a musíme aktualizovat tabulku Department_Type3 novou hodnotou GroupName_current. Protože to je, TYPE3 rozměr stolu požadavkem zde je, aby aktualizovat GroupName_old sloupec s „Výzkum a Vývoj“ a GroupName_Current s novou hodnotu.
--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
Jakmile jsme se spustit výše uvedený kód, budeme zachycovat výsledky z ODSTRANĚNÉ vnitřní tabulka, do @Aktualizováno proměnné tabulka a potom pomocí tohoto údaje aktualizovat poslední sloupce tabulky pro provádění tohoto TYPU 3 se pomalu mění rozměr. Můžeme vidět výsledek dat konečné tabulky před a po provedení výše uvedeného příkazu, jak je znázorněno na následujících obrázcích.
Před AKTUALIZACÍ provedení příkazu
Po AKTUALIZACI provedení příkazu
VÝSTUPNÍ Klauzule Omezení
Některé scénáře, kde VÝSTUPNÍ klauzule není podporován:
- příkazy DML, že referenční místní rozdělených zobrazení, distribuovaných rozdělených zobrazení nebo vzdálené tabulky.
- vložte příkazy, které obsahují příkaz EXECUTE.
- Fulltextové predikáty nejsou ve výstupní klauzuli povoleny, pokud je úroveň kompatibility databáze nastavena na 100.
- klauzuli výstup do nelze použít k vložení do zobrazení nebo funkce rowset.
- uživatelem definovanou funkci nelze vytvořit, pokud obsahuje klauzuli výstup do, která má jako cíl tabulku
úplný seznam je uveden v tomto odkazu: https://technet.microsoft.com/en-us/library/ms177564(v=sql.110).aspx
Shrnutí
, Jak je znázorněno ve výše uvedených příkladech můžeme vidět, že VÝSTUPNÍ klauzule je snadné použití a můžete vyhnout spoustu vlastní kódování s cílem zachytit výstup výsledků aktualizované hodnoty u obou starých a nových hodnot do tabulky proměnné během provádění dotazu.
Leave a Reply