Megosztás a következőn keresztül:


OUTPUT záradék (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

Egy , INSERTUPDATE, , vagy utasítás által DELETEérintett minden sorból származó információkat vagy MERGE kifejezéseket ad vissza. Ezeket az eredményeket vissza lehet adni a feldolgozó alkalmazásnak olyan célokra, mint a megerősítést kérő üzenetek, az archiválás és más ilyen alkalmazáskövetelmények. Az eredmények táblázatba vagy táblaváltozóba is beilleszthetők. Emellett rögzítheti egy OUTPUT záradék eredményeit egy beágyazott INSERT, UPDATE, vagy DELETEMERGE utasításban, és beszúrhatja ezeket az eredményeket egy céltáblába vagy nézetbe.

Note

A UPDATEzáradékkal INSERT rendelkező , DELETEvagy OUTPUT utasítás akkor is visszaadja a sorokat az ügyfélnek, ha az utasítás hibákat tapasztal, és vissza lesz állítva. Az eredményt nem szabad használni, ha hiba történik az utasítás futtatásakor.

Használat:

Transact-SQL szintaxis konvenciók

Syntax

<OUTPUT_CLAUSE> ::=
{
    [ OUTPUT <dml_select_list> INTO { @table_variable | output_table } [ ( column_list ) ] ]
    [ OUTPUT <dml_select_list> ]
}
<dml_select_list> ::=
{ <column_name> | scalar_expression } [ [ AS ] column_alias_identifier ]
    [ , ...n ]

<column_name> ::=
{ DELETED | INSERTED | from_table_name } . { * | column_name }
    | $action

Arguments

@table_variable

Olyan táblaváltozót ad meg, amelybe a visszaadott sorok be lesznek szúrva ahelyett, hogy visszakerülnek a hívónak. @table_variable a , INSERT, UPDATEvagy DELETE utasítás előtt MERGEkell deklarálni.

Ha column_list nincs megadva, a táblaváltozónak az eredményhalmazhoz OUTPUT hasonló számú oszlopmal kell rendelkeznie. A kivételek az identitások és a számított oszlopok, amelyeket ki kell hagyni. Ha column_list van megadva, a kihagyott oszlopoknak null értékeket kell engedélyezniük, vagy alapértelmezett értékeket kell hozzájuk rendelniük.

A táblaváltozókkal kapcsolatos további információkért lásd a táblázatot.

output_table

Olyan táblázatot ad meg, amelybe a visszaadott sorok be lesznek szúrva ahelyett, hogy visszakerülnek a hívónak. output_table lehet ideiglenes tábla.

Ha column_list nincs megadva, a táblának ugyanolyan számú oszlopmal kell rendelkeznie, mint az OUTPUT eredményhalmaznak. A kivételek az identitások és a számított oszlopok, amelyeket ki kell hagyni. Ha column_list van megadva, a kihagyott oszlopoknak null értékeket kell engedélyezniük, vagy alapértelmezett értékeket kell hozzájuk rendelniük.

output_table nem tudom:

  • Engedélyezve vannak rajta az eseményindítók.
  • Vegyen részt a FOREIGN KEY korlátozás mindkét oldalán.
  • Korlátozásokkal vagy engedélyezett szabályokkal rendelkezik CHECK .

column_list

A záradék céltáblájának oszlopneveinek INTO választható listája. Ez hasonló az INSERT utasításban engedélyezett oszloplistához.

scalar_expression

Szimbólumok és operátorok tetszőleges kombinációja, amelyek egyetlen értékre értékelnek. Az összesítő függvények nem engedélyezettek a scalar_expression.

A módosítandó tábla oszlopaira mutató hivatkozásokat az előtaggal vagy INSERTED az előtaggal kell minősíteniDELETED.

column_alias_identifier

Egy alternatív név, amely az oszlop nevére hivatkozik.

DELETED

Egy oszlopelőtag, amely megadja a frissítési vagy törlési művelet által törölt értéket, valamint az aktuális művelettel nem módosító meglévő értékeket. Az előrefixált DELETED oszlopok az , vagy UPDATEDELETE utasítás befejezése előtti MERGEértéket tükrözik.

DELETED nem használható az OUTPUT utasítás záradékával INSERT .

BEHELYEZETT

Egy oszlopelőtag, amely megadja a beszúrási vagy frissítési művelet által hozzáadott értéket, valamint minden olyan meglévő értéket, amely nem változik az aktuális művelettel. Az előtaggal ellátott INSERTED oszlopok az , vagy UPDATEINSERT utasítás befejezése utáni MERGEértéket tükrözik, de az eseményindítók végrehajtása előtt.

INSERTED nem használható az OUTPUT utasítás záradékával DELETE .

from_table_name

Oszlopelőtag, amely egy , FROMvagy DELETE utasítás záradékában UPDATEMERGEszereplő táblát határoz meg, amely a frissíteni vagy törölni kívánt sorok megadására szolgál.

Ha a módosítandó tábla is szerepel a záradékban, a FROM tábla oszlopaira mutató hivatkozásokat az előtaggal vagy INSERTED az előtaggal kell minősíteniDELETED.

*

A csillag (*) azt határozza meg, hogy a törlési, beszúrási vagy frissítési művelet által érintett összes oszlopot a rendszer abban a sorrendben adja vissza, amelyben a táblában léteznek.

Az alábbi OUTPUT DELETED.* utasítás például DELETE a táblából ShoppingCartItem törölt összes oszlopot adja vissza:

DELETE Sales.ShoppingCartItem
    OUTPUT DELETED.*;

column_name

Explicit oszlophivatkozás. A módosítandó táblára mutató hivatkozásokat a megfelelő előtaggal vagy előtaggal INSERTED kell megfelelően minősíteni, például: DELETED.INSERTED.<column_name>

$action

Csak az MERGE utasításhoz érhető el. Egy nvarchar(10) típusú oszlopot határoz meg egy OUTPUTMERGE utasítás záradékában, amely minden sor három értékének egyikét adja vissza: INSERT, UPDATEvagy DELETE, az adott sorban végrehajtott műveletnek megfelelően.

Remarks

A OUTPUT <dml_select_list> záradék és a OUTPUT <dml_select_list> INTO { @table_variable | output_table } záradék egyetlen INSERT, , UPDATEvagy DELETEMERGE utasításban határozható meg.

Note

Ellenkező rendelkezés hiányában a OUTPUT záradékra való hivatkozás a záradékra és a OUTPUTOUTPUT INTO záradékra is vonatkozik.

A OUTPUT záradék hasznos lehet az identitás vagy a számított oszlopok értékének lekéréséhez egy INSERT vagy UPDATE több művelet után.

Ha egy számított oszlop szerepel a <dml_select_list>fájlban, a kimeneti tábla vagy a táblaváltozó megfelelő oszlopa nem számított oszlop. Az új oszlop értékei azok az értékek, amelyeket az utasítás végrehajtásakor számítottak ki.

A módosítások táblára való alkalmazásának sorrendje és a sorok kimeneti táblába vagy táblaváltozóba való beszúrásának sorrendje nem garantált.

Ha a paraméterek vagy változók egy UPDATE utasítás részeként módosulnak, a OUTPUT záradék mindig a paraméter vagy változó értékét adja vissza, ahogyan az a módosított érték helyett az utasítás végrehajtása előtt volt.

Szintaxist használó OUTPUT kurzoron elhelyezett utasítással vagy UPDATE utasítással DELETE is használhatóWHERE CURRENT OF.

A OUTPUT záradék nem támogatott a következő utasításokban:

  • A helyi particionált nézetekre, elosztott particionált nézetekre vagy távoli táblákra hivatkozó DML-utasítások.

  • INSERT utasítást EXECUTE tartalmazó utasítások.

  • A záradék nem engedélyezi a OUTPUT teljes szöveges predikátumokat, ha az adatbázis kompatibilitási szintje 100- ra van állítva.

  • A OUTPUT INTO záradék nem használható nézetbe vagy sorhalmazfüggvénybe való beszúráshoz.

  • Felhasználó által definiált függvény nem hozható létre, ha olyan záradékot OUTPUT INTO tartalmaz, amelynek célja egy tábla.

A nemdeterminista viselkedés megakadályozása érdekében a OUTPUT záradék nem tartalmazhat a következő hivatkozásokat:

  • Olyan albekérdezések vagy felhasználó által definiált függvények, amelyek felhasználói vagy rendszeradatokhoz való hozzáférést végeznek, vagy feltételezik, hogy ilyen hozzáférést végeznek. A rendszer feltételezi, hogy a felhasználó által definiált függvények adathozzáférést hajtanak végre, ha nincsenek sémához kötve.

  • Egy nézetből vagy beágyazott táblázat értékű függvényből származó oszlop, ha az oszlopot az alábbi módszerek egyikével definiálja:

    • Egy allekérdezés.

    • Felhasználó által definiált függvény, amely felhasználói vagy rendszeradatokhoz való hozzáférést végez, vagy feltételezzük, hogy ilyen hozzáférést végez.

    • Egy olyan számított oszlop, amely egy felhasználó által definiált függvényt tartalmaz, amely a definíciójában felhasználói vagy rendszeradat-hozzáférést végez.

    Amikor az SQL Server észlel egy ilyen oszlopot a OUTPUT záradékban, a rendszer a 4186-os hibát észleli.

OUTPUT záradékból visszaadott adatok beszúrása táblázatba

Ha egy OUTPUT beágyazott INSERT, , UPDATEvagy DELETEutasításban lévő záradék eredményeit rögzíti, MERGE és az eredményeket beszúrja egy céltáblába, tartsa szem előtt az alábbi információkat:

  • Az egész művelet atomi. Vagy az INSERT utasítás és a záradékot tartalmazó OUTPUT beágyazott DML-utasítás, vagy a teljes utasítás meghiúsul.

  • A külső INSERT utasítás céljára a következő korlátozások vonatkoznak:

    • A cél nem lehet távoli tábla, nézet vagy közös táblakifejezés.

    • A cél nem rendelkezhet kényszerrel FOREIGN KEY , és nem hivatkozhat rá FOREIGN KEY .

    • Az eseményindítók nem definiálhatók a célon.

    • A cél nem vehet részt az egyesítési replikációban vagy a tranzakciós replikációhoz szükséges frissíthető előfizetésekben.

  • A beágyazott DML-utasításra a következő korlátozások vonatkoznak:

    • A cél nem lehet távoli tábla vagy particionált nézet.

    • Maga a forrás nem tartalmazhat záradékot <dml_table_source> .

  • A OUTPUT INTO záradék nem támogatott a záradékot INSERT tartalmazó utasításokban<dml_table_source>.

  • @@ROWCOUNT A csak a külső INSERT utasítás által beszúrt sorokat adja vissza.

  • @@IDENTITY, SCOPE_IDENTITYés IDENT_CURRENT csak a beágyazott DML-utasítás által létrehozott identitásértékeket adja vissza, a külső INSERT utasítás által létrehozott értékeket nem.

  • A lekérdezési értesítések egyetlen entitásként kezelik az utasítást, és a létrehozott üzenetek típusa a beágyazott DML típusa, még akkor is, ha a jelentős változás a külső INSERT utasításból származik.

  • A záradékban a <dml_table_source>SELECTWHERE záradékok nem tartalmazhatnak al lekérdezéseket, összesítő függvényeket, rangsorolási függvényeket, teljes szöveges predikátumokat, adathozzáférést végző felhasználó által definiált függvényeket vagy a függvényt.TEXTPTR()

Parallelism

Az OUTPUT ügyfélnek vagy a táblaváltozónak eredményül adott záradék mindig soros tervet használ.

Ha egy 130-ás vagy annál magasabb kompatibilitási szintű adatbázis kontextusában egy INSERT...SELECT művelet az utasításhoz egy tippet WITH (TABLOCK) használ SELECTOUTPUT...INTO, és egy ideiglenes vagy felhasználói táblába is beszúr, akkor a INSERT...SELECT céltábla a részösszeg költségétől függően jogosult a párhuzamosságra. A záradékban OUTPUT INTO hivatkozott céltábla nem jogosult párhuzamosságra.

Triggers

A visszaadott OUTPUT oszlopok tükrözik az adatokat az , , INSERTvagy UPDATE utasítás befejeződése utánDELETE, de az eseményindítók végrehajtása előtt.

Az eseményindítók esetében INSTEAD OF a visszaadott eredmények úgy jönnek létre, mintha a INSERT, UPDATEvagy DELETE ténylegesen történt volna, még akkor is, ha az eseményindító művelet eredményeként nem történik módosítás. Ha egy záradékot OUTPUT tartalmazó utasítást használ egy eseményindító törzsén belül, akkor a beszúrt és törölt táblákra való hivatkozáshoz tábla aliasokat kell használni, hogy elkerülje az oszlophivatkozások duplikálását a társított és INSERTED a DELETED kapcsolódó táblákkalOUTPUT.

Ha a záradék a OUTPUT kulcsszó megadása nélkül van megadva INTO , a DML-művelet célja nem rendelkezhet az adott DML-művelethez definiált engedélyezett eseményindítóval. Ha például a OUTPUT záradék egy UPDATE utasításban van definiálva, a céltábla nem rendelkezhet engedélyezett UPDATE eseményindítókkal.

Ha a sp_configure beállítás letiltja az eseményindítók eredményeit, egy OUTPUT záradék nélküli INTO záradék miatt az utasítás meghiúsul, amikor egy eseményindítóból hívják meg.

Adattípusok

A OUTPUT záradék támogatja a nagy objektum adattípusokat: nvarchar(max), varchar(max), varbinary(max), text, ntext, image és xml. Ha az .WRITEUPDATE utasításban szereplő záradékkal módosít egy nvarchar(max), varchar(max) vagy varbinary(max) oszlopot, akkor a rendszer az értékek teljes előtti és utáni értékeit adja vissza, ha hivatkoznak rájuk. A TEXTPTR() függvény nem jelenhet meg kifejezés részeként a záradékban lévő szöveg, ntext vagy képoszloponOUTPUT.

Queues

A táblákat üzenetsorként használó alkalmazásokban, illetve köztes eredményhalmazok tárolására is használható OUTPUT . Vagyis az alkalmazás folyamatosan ad hozzá vagy távolít el sorokat a táblából. Az alábbi példa egy OUTPUTDELETE utasítás záradékával adja vissza a törölt sort a hívó alkalmazásnak.

USE AdventureWorks2022;
GO

DELETE TOP(1) dbo.DatabaseLog WITH (READPAST)
OUTPUT DELETED.*
WHERE DatabaseLogID = 7;
GO

Ez a példa eltávolít egy sort egy üzenetsorként használt táblából, és egyetlen műveletben adja vissza a törölt értékeket a feldolgozó alkalmazásnak. Más szemantikák is implementálhatók, például tábla használatával implementálhatók a veremek. Az SQL Server azonban nem garantálja a sorok feldolgozásának sorrendjét, és a záradékot használó DML-utasítások adják vissza.OUTPUT Az alkalmazásnak tartalmaznia kell egy megfelelő WHERE záradékot, amely garantálja a kívánt szemantikát, vagy tisztában van azzal, hogy ha több sor is jogosult a DML-műveletre, nincs garantált sorrend. Az alábbi példa egy al lekérdezést használ, és feltételezi, hogy az egyediség az oszlop jellemzője a DatabaseLogID kívánt rendezési szemantikák implementálásához.

USE tempdb;
GO

CREATE TABLE dbo.table1
(
    id INT,
    employee VARCHAR(32)
);
GO

INSERT INTO dbo.table1
VALUES (1, 'Fred'),
    (2, 'Tom'),
    (3, 'Sally'),
    (4, 'Alice');
GO

DECLARE @MyTableVar TABLE (
    id INT,
    employee VARCHAR(32)
);

PRINT 'table1, before delete';

SELECT *
FROM dbo.table1;

DELETE
FROM dbo.table1
OUTPUT DELETED.*
INTO @MyTableVar
WHERE id = 4
    OR id = 2;

PRINT 'table1, after delete';

SELECT *
FROM dbo.table1;

PRINT '@MyTableVar, after delete';

SELECT *
FROM @MyTableVar;

DROP TABLE dbo.table1;

Az eredmények a következők:

table1, before delete
id          employee
----------- ------------------------------
1           Fred
2           Tom
3           Sally
4           Alice

table1, after delete
id          employee
----------- ------------------------------
1           Fred
3           Sally

@MyTableVar, after delete
id          employee
----------- ------------------------------
2           Tom
4           Alice

Note

Ha a forgatókönyv lehetővé teszi, hogy több alkalmazás is végezzen romboló olvasást egy táblából, használja a READPAST táblázatra vonatkozó tippet UPDATE és DELETE utasításokat. Ez megakadályozza azokat a zárolási problémákat, amelyek akkor fordulhatnak elő, ha egy másik alkalmazás már beolvassa a tábla első minősítő rekordját.

Permissions

engedélyekre van szükség minden olyan oszlopon, amelyen keresztül lekérte vagy felhasználta a következőt: .>

INSERT a megadott táblákhoz <output_table>engedélyekre van szükség.

Examples

A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.

A. A OUTPUT INTO használata INSERT utasítással

Az alábbi példa beszúr egy sort a ScrapReason táblába, és a OUTPUT záradék használatával visszaadja az utasítás eredményét a @MyTableVar táblaváltozónak. Mivel az ScrapReasonID oszlop identitástulajdonságokkal van definiálva, az adott oszlop utasításában INSERT nincs megadva érték. Az adatbázismotor által az adott oszlophoz létrehozott érték azonban az OUTPUT oszlop INSERTED.ScrapReasonIDzáradékában lesz visszaadva.

USE AdventureWorks2022;
GO

DECLARE @MyTableVar TABLE (
    NewScrapReasonID SMALLINT,
    Name VARCHAR(50),
    ModifiedDate DATETIME
);

INSERT Production.ScrapReason
    OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
        INTO @MyTableVar
VALUES (N'Operator error', GETDATE());

--Display the result set of the table variable.
SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate
FROM Production.ScrapReason;
GO

B. A OUTPUT használata DELETE utasítással

Az alábbi példa a tábla összes sorát ShoppingCartItem törli. A záradék OUTPUT DELETED.* azt határozza meg, hogy az DELETE utasítás eredménye, azaz a törölt sorok összes oszlopa visszakerül a hívó alkalmazásba. Az SELECT alábbi utasítás ellenőrzi a tábla törlési műveletének ShoppingCartItem eredményeit.

USE AdventureWorks2022;
GO

DELETE Sales.ShoppingCartItem
OUTPUT DELETED.*
WHERE ShoppingCartID = 20621;

--Verify the rows in the table matching the WHERE clause have been deleted.
SELECT COUNT(*) AS [Rows in Table] FROM Sales.ShoppingCartItem WHERE ShoppingCartID = 20621;
GO

C. A OUTPUT INTO használata UPDATE utasítással

Az alábbi példa 25 százalékkal frissíti a VacationHoursEmployee táblázat oszlopát az első 10 sorban. A OUTPUT záradék az VacationHours oszlopban UPDATElévő utasítás alkalmazása DELETED.VacationHours előtt létező értéket és az oszlopban INSERTED.VacationHours lévő frissített értéket adja vissza a @MyTableVar táblaváltozóra.

Két SELECT utasítás következik, amelyek a tábla frissítési műveletének @MyTableVar értékeit Employee és eredményeit adnak vissza.

USE AdventureWorks2022;
GO

DECLARE @MyTableVar TABLE (
    EmpID INT NOT NULL,
    OldVacationHours INT,
    NewVacationHours INT,
    ModifiedDate DATETIME);

UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25,
    ModifiedDate = GETDATE()
OUTPUT INSERTED.BusinessEntityID,
       DELETED.VacationHours,
       INSERTED.VacationHours,
       INSERTED.ModifiedDate
INTO @MyTableVar;

--Display the result set of the table variable.
SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate
FROM @MyTableVar;
GO
--Display the result set of the table.
SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDate
FROM HumanResources.Employee;
GO

D. Kifejezés visszaadása a OUTPUT INTO használatával

Az alábbi példa a C példára épül azáltal, hogy a OUTPUT záradékban egy kifejezést határoz meg a frissített VacationHours érték és a VacationHours frissítés alkalmazása előtti érték közötti különbségként. Ennek a kifejezésnek az értékét visszaadja a @MyTableVar táblaváltozó az oszlopban VacationHoursDifference.

USE AdventureWorks2022;
GO

DECLARE @MyTableVar TABLE (
    EmpID INT NOT NULL,
    OldVacationHours INT,
    NewVacationHours INT,
    VacationHoursDifference INT,
    ModifiedDate DATETIME);

UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25,
    ModifiedDate = GETDATE()
OUTPUT INSERTED.BusinessEntityID,
       DELETED.VacationHours,
       INSERTED.VacationHours,
       INSERTED.VacationHours - DELETED.VacationHours,
       INSERTED.ModifiedDate
INTO @MyTableVar;

--Display the result set of the table variable.
SELECT EmpID, OldVacationHours, NewVacationHours,
    VacationHoursDifference, ModifiedDate
FROM @MyTableVar;
GO
SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDate
FROM HumanResources.Employee;
GO

E. A OUTPUT INTO használata from_table_name egy UPDATE utasításban

Az alábbi példa frissíti a ScrapReasonID tábla oszlopát az WorkOrder összes megadott ProductID és ScrapReasonID. A OUTPUT INTO záradék a frissítendő táblából (WorkOrder) és a táblából származó értékeket is visszaadja Product . A Product tábla a záradékban FROM a frissítendő sorok megadására szolgál. Mivel a WorkOrder táblában egy AFTER UPDATE eseményindító van definiálva, a INTO kulcsszóra van szükség.

USE AdventureWorks2022;
GO

DECLARE @MyTestVar TABLE (
    OldScrapReasonID INT NOT NULL,
    NewScrapReasonID INT NOT NULL,
    WorkOrderID INT NOT NULL,
    ProductID INT NOT NULL,
    ProductName NVARCHAR(50)NOT NULL);

UPDATE Production.WorkOrder
SET ScrapReasonID = 4
OUTPUT DELETED.ScrapReasonID,
       INSERTED.ScrapReasonID,
       INSERTED.WorkOrderID,
       INSERTED.ProductID,
       p.Name
    INTO @MyTestVar
FROM Production.WorkOrder AS wo
    INNER JOIN Production.Product AS p
    ON wo.ProductID = p.ProductID
    AND wo.ScrapReasonID= 16
    AND p.ProductID = 733;

SELECT OldScrapReasonID, NewScrapReasonID, WorkOrderID,
    ProductID, ProductName
FROM @MyTestVar;
GO

F. A OUTPUT INTO használata from_table_name a DELETE utasításban

Az alábbi példa az utasítás záradékában meghatározott keresési feltételek alapján törli a ProductProductPhotoFROM tábla sorait DELETE . A OUTPUT záradék a törölt táblából (DELETED.ProductID, DELETED.ProductPhotoID) és a Product táblából származó oszlopokat adja vissza. Ez a tábla a FROM záradékban a törölni kívánt sorok megadására szolgál.

USE AdventureWorks2022;
GO

DECLARE @MyTableVar TABLE (
    ProductID INT NOT NULL,
    ProductName NVARCHAR(50)NOT NULL,
    ProductModelID INT NOT NULL,
    PhotoID INT NOT NULL);

DELETE Production.ProductProductPhoto
OUTPUT DELETED.ProductID,
       p.Name,
       p.ProductModelID,
       DELETED.ProductPhotoID
    INTO @MyTableVar
FROM Production.ProductProductPhoto AS ph
JOIN Production.Product as p
    ON ph.ProductID = p.ProductID
    WHERE p.ProductModelID BETWEEN 120 and 130;

--Display the results of the table variable.
SELECT ProductID, ProductName, ProductModelID, PhotoID
FROM @MyTableVar
ORDER BY ProductModelID;
GO

G. A OUTPUT INTO használata nagy objektum adattípussal

Az alábbi példa a záradék használatával DocumentSummary frissíti a tábla egy Production.Document oszlopának .WRITE egy részleges értékét. A szó components helyébe a features helyettesítő szót, a lecserélendő szó kezdő helyét (eltolását) és a lecserélendő karakterek számát (hosszát) kell megadni. A példa a OUTPUT záradék használatával adja vissza az oszlop előtti és utáni képeket DocumentSummary a @MyTableVar táblaváltozónak. Az oszlop képeinek teljes elő- és utóképei DocumentSummary lesznek visszaadva.

USE AdventureWorks2022;
GO

DECLARE @MyTableVar TABLE (
    SummaryBefore NVARCHAR(MAX),
    SummaryAfter NVARCHAR(MAX)
);

UPDATE Production.Document
SET DocumentSummary.WRITE(N'features', 28, 10)
OUTPUT DELETED.DocumentSummary,
       INSERTED.DocumentSummary
    INTO @MyTableVar
WHERE Title = N'Front Reflector Bracket Installation';

SELECT SummaryBefore, SummaryAfter
FROM @MyTableVar;
GO

H. A KIMENET használata trigger helyett

Az alábbi példa az OUTPUT eseményindító záradékát használja az eseményindító művelet eredményeinek visszaadásához. Először létrejön egy nézet a ScrapReason táblában, majd egy INSTEAD OF INSERT eseményindító lesz definiálva a nézetben, amely lehetővé teszi, hogy a felhasználó csak az Name alaptábla oszlopát módosítsa. Mivel az oszlop ScrapReasonID egy IDENTITY oszlop az alaptáblában, az eseményindító figyelmen kívül hagyja a felhasználó által megadott értéket. Ez lehetővé teszi, hogy az adatbázismotor automatikusan létrehozza a megfelelő értéket. Emellett a felhasználó ModifiedDate által megadott érték figyelmen kívül lesz hagyva, és az aktuális dátumra van állítva. A OUTPUT záradék a táblába ScrapReason ténylegesen beszúrt értékeket adja vissza.

USE AdventureWorks2022;
GO

IF OBJECT_ID('dbo.vw_ScrapReason', 'V') IS NOT NULL
    DROP VIEW dbo.vw_ScrapReason;
GO

CREATE VIEW dbo.vw_ScrapReason
AS
SELECT ScrapReasonID,
    Name,
    ModifiedDate
FROM Production.ScrapReason;
GO

CREATE TRIGGER dbo.io_ScrapReason ON dbo.vw_ScrapReason
INSTEAD OF INSERT
AS
BEGIN
    --ScrapReasonID is not specified in the list of columns to be inserted
    --because it is an IDENTITY column.
    INSERT INTO Production.ScrapReason (
        Name,
        ModifiedDate
    )
    OUTPUT INSERTED.ScrapReasonID,
        INSERTED.Name,
        INSERTED.ModifiedDate
    SELECT Name, GETDATE()
    FROM INSERTED;
END
GO

INSERT vw_ScrapReason (
    ScrapReasonID,
    Name,
    ModifiedDate
)
VALUES (
    99,
    N'My scrap reason',
    '20030404'
);
GO

Íme a 2004. április 12-én létrehozott eredményhalmaz ('2004-04-12'). Az ScrapReasonIDActual oszlopok az ModifiedDate utasításban megadott értékek helyett az eseményindító művelet által létrehozott értékeket tükrözik INSERT .

ScrapReasonID  Name             ModifiedDate
-------------  ---------------- -----------------------
17             My scrap reason  2004-04-12 16:23:33.050

I. A OUTPUT INTO használata identitással és számított oszlopokkal

Az alábbi példa létrehozza a EmployeeSales táblát, majd több sort szúr be egy INSERT utasítással SELECT a forrástáblák adatainak lekéréséhez. A EmployeeSales táblázat egy identitásoszlopot (EmployeeID) és egy számított oszlopot (ProjectedSales) tartalmaz.

USE AdventureWorks2022;
GO

IF OBJECT_ID('dbo.EmployeeSales', 'U') IS NOT NULL
    DROP TABLE dbo.EmployeeSales;
GO

CREATE TABLE dbo.EmployeeSales (
    EmployeeID INT IDENTITY(1, 5) NOT NULL,
    LastName NVARCHAR(20) NOT NULL,
    FirstName NVARCHAR(20) NOT NULL,
    CurrentSales MONEY NOT NULL,
    ProjectedSales AS CurrentSales * 1.10
);
GO

DECLARE @MyTableVar TABLE (
    EmployeeID INT NOT NULL,
    LastName NVARCHAR(20) NOT NULL,
    FirstName NVARCHAR(20) NOT NULL,
    CurrentSales MONEY NOT NULL,
    ProjectedSales MONEY NOT NULL
);

INSERT INTO dbo.EmployeeSales (
    LastName,
    FirstName,
    CurrentSales
)
OUTPUT INSERTED.EmployeeID,
    INSERTED.LastName,
    INSERTED.FirstName,
    INSERTED.CurrentSales,
    INSERTED.ProjectedSales
INTO @MyTableVar
SELECT c.LastName,
    c.FirstName,
    sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
    ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.BusinessEntityID LIKE '2%'
ORDER BY c.LastName,
    c.FirstName;

SELECT EmployeeID,
    LastName,
    FirstName,
    CurrentSales,
    ProjectedSales
FROM @MyTableVar;
GO

SELECT EmployeeID,
    LastName,
    FirstName,
    CurrentSales,
    ProjectedSales
FROM dbo.EmployeeSales;
GO

J. Az OUTPUT és a OUTPUT INTO használata egyetlen utasításban

Az alábbi példa az utasítás záradékában meghatározott keresési feltételek alapján törli a ProductProductPhotoFROM tábla sorait DELETE . A OUTPUT INTO záradék a törölt tábla oszlopait (DELETED.ProductID, DELETED.ProductPhotoID) és a Product tábla oszlopait adja vissza a @MyTableVar tábla változójának. A Product tábla a záradékban FROM a törölni kívánt sorok megadására szolgál. A OUTPUT záradék visszaadja a DELETED.ProductID, DELETED.ProductPhotoID oszlopokat, valamint azt a dátumot és időpontot, amikor a sor törölve lett a ProductProductPhoto táblából a hívó alkalmazásba.

USE AdventureWorks2022;
GO

DECLARE @MyTableVar TABLE (
    ProductID INT NOT NULL,
    ProductName NVARCHAR(50) NOT NULL,
    ProductModelID INT NOT NULL,
    PhotoID INT NOT NULL
);

DELETE Production.ProductProductPhoto
OUTPUT DELETED.ProductID,
    p.Name,
    p.ProductModelID,
    DELETED.ProductPhotoID
INTO @MyTableVar
OUTPUT DELETED.ProductID,
    DELETED.ProductPhotoID,
    GETDATE() AS DeletedDate
FROM Production.ProductProductPhoto AS ph
INNER JOIN Production.Product AS p
    ON ph.ProductID = p.ProductID
WHERE p.ProductID BETWEEN 800
        AND 810;

--Display the results of the table variable.
SELECT ProductID,
    ProductName,
    PhotoID,
    ProductModelID
FROM @MyTableVar;
GO

K. OUTPUT záradékból visszaadott adatok beszúrása

Az alábbi példa egy OUTPUT utasítás záradékából MERGE visszaadott adatokat rögzíti, és beszúrja az adatokat egy másik táblába. Az MERGE utasítás naponta frissíti a QuantityProductInventory tábla oszlopát a táblázatban feldolgozott SalesOrderDetail rendelések alapján. Emellett törli azoknak a termékeknek a sorait is, amelyek készletei kisebbek vagy kisebbek 0 . A példa rögzíti a törölt sorokat, és beszúrja őket egy másik táblába, ZeroInventoryamely leltár nélküli termékeket követ nyomon.

USE AdventureWorks2022;
GO

IF OBJECT_ID(N'Production.ZeroInventory', N'U') IS NOT NULL
    DROP TABLE Production.ZeroInventory;
GO

--Create ZeroInventory table.
CREATE TABLE Production.ZeroInventory (
    DeletedProductID INT,
    RemovedOnDate DATETIME
    );
GO

INSERT INTO Production.ZeroInventory (
    DeletedProductID,
    RemovedOnDate
)
SELECT ProductID,
    GETDATE()
FROM (
    MERGE Production.ProductInventory AS pi
    USING (
        SELECT ProductID,
            SUM(OrderQty)
        FROM Sales.SalesOrderDetail AS sod
        INNER JOIN Sales.SalesOrderHeader AS soh
            ON sod.SalesOrderID = soh.SalesOrderID
                AND soh.OrderDate = '20070401'
        GROUP BY ProductID
        ) AS src(ProductID, OrderQty)
        ON (pi.ProductID = src.ProductID)
    WHEN MATCHED
        AND pi.Quantity - src.OrderQty <= 0
        THEN
            DELETE
    WHEN MATCHED
        THEN
            UPDATE
            SET pi.Quantity = pi.Quantity - src.OrderQty
    OUTPUT $ACTION,
        DELETED.ProductID
    ) AS Changes(Action, ProductID)
WHERE Action = 'DELETE';

IF @@ROWCOUNT = 0
    PRINT 'Warning: No rows were inserted';
GO

SELECT DeletedProductID,
    RemovedOnDate
FROM Production.ZeroInventory;
GO