OUTPUT-Klausel (Transact-SQL)
Aktualisiert: 12. Dezember 2006
Gibt Informationen aus bzw. Ausdrücke basierend auf den einzelnen Zeilen zurück, auf die eine INSERT-, UPDATE- oder DELETE-Anweisung Auswirkungen hat. Diese Ergebnisse können an die verarbeitende Anwendung zurückgegeben werden, die sie z. B. für Bestätigungen, Archivierungen und andere Anwendungsanforderungen verwendet. Alternativ können Ergebnisse in eine Tabelle oder Tabellenvariable eingefügt werden.
Verwendung in:
Transact-SQL-Syntaxkonventionen
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 }
Argumente
@table_variable
Gibt eine table-Variable an, in die die zurückgegebenen Zeilen eingefügt werden, statt an den Aufrufer zurückgegeben zu werden. @table_variable muss vor der INSERT-, UPDATE- oder DELETE-Anweisung deklariert werden.Wenn column_list nicht angegeben wird, muss die table-Variable dieselbe Anzahl von Spalten wie das OUTPUT-Resultset aufweisen. Ausnahmen bilden Identitätsspalten sowie berechnete Spalten, die ausgelassen werden müssen. Wenn column_list angegeben wird, müssen alle ausgelassenen Spalten entweder NULL-Werte zulassen oder über zugewiesene Standardwerte verfügen.
Weitere Informationen zu table-Variablen finden Sie unter table (Transact-SQL).
output_table
Gibt eine Tabelle an, in die die zurückgegebenen Zeilen eingefügt werden, statt an den Aufrufer zurückgegeben zu werden. output_table kann eine temporäre Tabelle sein.Wenn column_list nicht angegeben wird, muss die Tabelle dieselbe Anzahl von Spalten wie das OUTPUT-Resultset aufweisen. Ausnahmen bilden Identitätsspalten sowie berechnete Spalten. Diese müssen ausgelassen werden. Wenn column_list angegeben wird, müssen alle ausgelassenen Spalten entweder NULL-Werte zulassen oder über zugewiesene Standardwerte verfügen.
Für output_table ist Folgendes nicht möglich:
- Keine Definition von aktivierten Triggern.
- Keine Beteiligung an einer der Seiten einer Fremdschlüsseleinschränkung.
- Keine CHECK-Einschränkungen oder aktivierten Regeln.
- column_list
Ist eine optionale Liste mit Spaltennamen in der Zieltabelle der INTO-Klausel. Ist analog zu der in der INSERT-Anweisung zulässigen Spaltenliste.
scalar_expression
Ist eine beliebige Kombination von Symbolen und Operatoren, die zu genau einem Wert ausgewertet werden. Aggregatfunktionen sind in scalar_expression nicht zulässig.Alle Verweise auf Spalten in der Tabelle, die geändert wird, müssen mit dem INSERTED- oder DELETED-Präfix gekennzeichnet werden.
- column_alias_identifier
Ist ein alternativer Name, über den auf den Spaltennamen verwiesen wird.
DELETED
Ist ein Spaltenpräfix, das den durch den Aktualisierungs- oder Löschvorgang gelöschten Wert angibt. Spalten mit dem DELETED-Präfix spiegeln den Wert vor dem Abschluss der UPDATE- oder DELETE-Anweisung wider.DELETED kann nicht mit der OUTPUT-Klausel in der INSERT-Anweisung verwendet werden.
INSERTED
Ist ein Spaltenpräfix, das den durch den Einfüge- oder Aktualisierungsvorgang hinzugefügten Wert angibt. Spalten mit dem INSERTED-Präfix spiegeln den Wert nach Abschluss der UPDATE- oder INSERT-Anweisung wider, jedoch vor dem Ausführen von Triggern.INSERTED kann nicht mit der OUTPUT-Klausel in der DELETE-Anweisung verwendet werden.
from_table_name
Ist ein Spaltenpräfix, das eine Tabelle angibt, die in der FROM-Klausel einer DELETE- oder UPDATE-Anweisung enthalten ist, welche zur Angabe der zu aktualisierenden oder zu löschenden Zeilen verwendet wird.Wird die Tabelle, die geändert wird, auch in der FROM-Klausel angegeben, müssen alle Verweise auf Spalten in dieser Tabelle durch das INSERTED- oder DELETED-Präfix gekennzeichnet werden.
*
Gibt an, dass alle vom Lösch-, Einfüge- oder Aktualisierungsvorgang betroffenen Spalten in der Reihenfolge zurückgegeben werden, in der sie in der Tabelle vorkommen.So gibt beispielsweise
OUTPUT DELETED.*
in der folgenden DELETE-Anweisung alle aus derShoppingCartItem
-Tabelle zurückgegebenen Spalten zurück:DELETE Sales.ShoppingCartItem OUTPUT DELETED.*;
- column_name
Ist ein expliziter Spaltenverweis. Alle Verweise auf die Tabelle, die geändert wird, müssen entweder durch das INSERTED- oder das DELETED-Präfix richtig gekennzeichnet werden, wie z. B. INSERTED**.**column_name.
Hinweise
Die OUTPUT <dml_select_list>-Klausel und die OUTPUT <dml_select_list> INTO { @table_variable | output_table }-Klausel können in einer einzelnen INSERT-, UPDATE- oder DELETE-Anweisung definiert werden.
![]() |
---|
Sofern nicht anderweitig angegeben, beziehen sich Verweise auf die OUTPUT-Klausel sowohl auf die OUTPUT- als auch die OUTPUT INTO-Klausel. |
Die OUTPUT-Klausel kann zum Abrufen des Wertes von Identitätsspalten oder berechneten Spalten nach einem INSERT- oder UPDATE-Vorgang genutzt werden.
Ist eine berechnete Spalte in <dml_select_list> enthalten, handelt es sich bei der entsprechenden Spalte in der Ausgabetabelle oder -tabellenvariablen nicht um eine berechnete Spalte. Die Werte in der neuen Spalte entsprechen den Werten, die zum Zeitpunkt der Ausführung der Anweisung berechnet wurden.
Die OUTPUT-Klausel wird von den folgenden Anweisungen nicht unterstützt:
- DML-Anweisungen, die auf lokale partitionierte Sichten, verteilte partitionierte Sichten oder Remotetabellen verweisen.
- INSERT-Anweisungen, die eine EXECUTE-Anweisung enthalten.
Die OUTPUT INTO-Klausel kann nicht zum Einfügen in eine Sicht oder eine Rowsetfunktion verwendet werden.
Es kann nicht sichergestellt werden, dass die Reihenfolge, in der die Änderungen auf die Tabelle angewendet werden, der Reihenfolge entspricht, in der die Zeilen in die Ausgabetabelle oder -tabellenvariable eingefügt werden.
Wenn Parameter oder Variablen im Rahmen einer UPDATE-Anweisung geändert werden, gibt die OUTPUT-Klausel immer den Wert des Parameters oder der Variablen vor der Ausführung der Anweisung zurück, statt des geänderten Wertes.
OUTPUT kann mit einer UPDATE- oder DELETE-Anweisung auf einem Cursor mit WHERE CURRENT OF-Syntax verwendet werden.
Zur Verhinderung eines nicht deterministischen Verhaltens darf die OUTPUT-Klausel keine Unterabfragen oder benutzerdefinierten Funktionen enthalten, die einen Benutzer- oder Datenzugriff ausführen bzw. von denen ausgegangen wird, dass sie einen derartigen Zugriff ausführen. Von benutzerdefinierten Funktionen wird angenommen, dass sie einen Datenzugriff ausführen, wenn sie nicht schemagebunden sind.
Trigger
Von OUTPUT zurückgegebene Spalten spiegeln die Daten nach Abschluss der INSERT-, UPDATE- oder DELETE-Anweisung wider, jedoch vor der Ausführung der Trigger.
Bei INSTEAD OF-Triggern werden die zurückgegebenen Ergebnisse so generiert, als ob die INSERT-, UPDATE- oder DELETE-Anweisung tatsächlich stattgefunden hat, selbst wenn keine Änderungen als Folge des Triggervorgangs vorgenommen werden. Wird eine Anweisung, die eine OUTPUT-Klausel enthält, innerhalb eines Triggers verwendet, müssen Tabellenaliase zum Verweisen auf die Tabellen inserted und deleted des Triggers verwendet werden, um das Duplizieren von Spaltenverweisen mithilfe der OUTPUT zugeordneten Tabellen INSERTED und DELETED zu vermeiden.
Wird die OUTPUT-Klausel angegeben, ohne auch das INTO-Schlüsselwort anzugeben, kann für das Ziel des DML-Vorgangs kein aktivierter Trigger für die bestimmte DML-Aktion definiert werden. Wird beispielsweise die OUTPUT-Klausel in einer UPDATE-Anweisung definiert, können keine aktivierten UPDATE-Trigger für die Zieltabelle festgelegt werden.
Wird die sp_configure-Option disallow results from triggers festgelegt, hat eine OUTPUT-Klausel ohne INTO-Klausel zur Folge, dass die Anweisung fehlschlägt, wenn sie aus einem Trigger heraus aufgerufen wird.
Datentypen
Die OUTPUT-Klausel unterstützt die großen Objektdatentypen nvarchar(max), varchar(max), varbinary(max), text, ntext, image und xml. Wird die .WRITE-Klausel in der UPDATE-Anweisung zum Ändern einer nvarchar(max)-, varchar(max)- oder varbinary(max)-Spalte verwendet, werden die vollständigen Anfangs- und Endabbilder der Werte zurückgegeben, wenn auf sie verwiesen wird. Die TEXTPTR( )-Funktion kann nicht im Rahmen eines Ausdrucks in einer text-, ntext- oder image-Spalte in der OUTPUT-Klausel angezeigt werden.
Warteschlangen
OUTPUT kann in Anwendungen, die Tabellen als Warteschlangen verwenden, oder zum Aufbewahren von Zwischenresultsets verwendet werden. Die Anwendung fügt der Tabelle somit kontinuierlich Zeilen hinzu oder entfernt sie daraus. Im folgenden Beispiel wird die OUTPUT-Klausel in einer DELETE-Anweisung verwendet, um die gelöschte Zeile an die aufrufende Anwendung zurückzugeben.
USE AdventureWorks;
GO
DELETE TOP(1) dbo.DatabaseLog WITH (READPAST)
OUTPUT deleted.*
WHERE DatabaseLogID = 7;
GO
In diesem Beispiel wird eine Zeile aus einer als Warteschlange verwendeten Tabelle entfernt und die gelöschten Werte in einer einzigen Aktion an die verarbeitende Anwendung zurückgegeben. Zusätzliche Semantik kann ebenfalls implementiert werden, wie z. B. die Verwendung einer Tabelle zum Implementieren eines Stapels. SQL Server stellt jedoch die Reihenfolge nicht sicher, in der Zeilen verarbeitet und von DML-Anweisungen mithilfe der OUTPUT-Klausel zurückgegeben werden. Es hängt von der Anwendung ab, eine entsprechende WHERE-Klausel einzufügen, die die gewünschte Semantik sicherstellen kann. Wenn mehrere Zeilen Anspruch auf den DML-Vorgang haben, kann keine bestimmte Reihenfolge sichergestellt werden. Im folgenden Beispiel wird eine Unterabfrage verwendet und davon ausgegangen, dass die DatabaseLogID
-Spalte eindeutig ist, um die gewünschte Reihenfolgensemantik zu implementieren.
USE tempdb
go
CREATE TABLE table1
(
id INT,
employee VARCHAR(32)
)
go
INSERT INTO table1 VALUES(1, 'Fred')
INSERT INTO table1 VALUES(2, 'Tom')
INSERT INTO table1 VALUES(3, 'Sally')
INSERT INTO table1 VALUES(4, 'Alice')
GO
DECLARE @MyTableVar TABLE
(
id INT,
employee VARCHAR(32)
)
PRINT 'table1, before delete'
SELECT * FROM table1
DELETE FROM table1
OUTPUT DELETED.* INTO @MyTableVar
WHERE id = 4 OR id = 2
PRINT 'table1, after delete'
SELECT * FROM table1
PRINT '@MyTableVar, after delete'
SELECT * FROM @MyTableVar
DROP TABLE table1
--Results
--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
![]() |
---|
Verwenden Sie den READPAST-Tabellenhinweis in UPDATE- und DELETE-Anweisungen, wenn es in Ihrem Szenario möglich ist, dass mehrere Anwendungen einen destruktiven Lesevorgang aus einer Tabelle ausführen. So werden Sperrkonflikte verhindert, die entstehen, wenn eine andere Anwendung bereits den ersten berechtigten Datensatz in der Tabelle liest. |
Berechtigungen
SELECT-Berechtigungen sind für alle mithilfe von <dml_select_list> abgerufenen oder für alle in <scalar_expression> verwendeten Spalten erforderlich.
INSERT-Berechtigungen werden für alle in <output_table> angegebenen Tabellen benötigt.
Beispiele
A. Verwenden von OUTPUT INTO mit einer einfachen INSERT-Anweisung
Im folgenden Beispiel wird eine Zeile in die ScrapReason
-Tabelle eingefügt und die Ergebnisse der Anweisung mithilfe der OUTPUT
-Klausel an die @MyTableVar
table-Variable zurückgegeben. Da die ScrapReasonID
-Spalte mit einer IDENTITY-Eigenschaft definiert wurde, wird kein Wert in der INSERT
-Anweisung für diese Spalte angegeben. Der von Datenbankmodul für diese Spalte generierte Wert wird jedoch in der OUTPUT
-Klausel in der INSERTED.ScrapReasonID
-Spalte zurückgegeben.
USE AdventureWorks;
GO
DECLARE @MyTableVar table( ScrapReasonID 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 ScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate
FROM Production.ScrapReason;
GO
B. Verwenden von OUTPUT mit einer DELETE-Anweisung
Im folgenden Beispiel werden alle Zeilen in der ShoppingCartItem
-Tabelle gelöscht. Die OUTPUT DELETED.*
-Klausel gibt an, dass die Ergebnisse der DELETE
-Anweisung, also alle Spalten in den gelöschten Zeilen, an die aufrufende Anweisung zurückgegeben werden. Die nachfolgende SELECT
-Anweisung überprüft die Ergebnisse des Löschvorgangs in der ShoppingCartItem
-Tabelle.
USE AdventureWorks;
GO
DELETE Sales.ShoppingCartItem
OUTPUT DELETED.* ;
--Verify all rows in the table have been deleted.
SELECT COUNT(*) AS [Rows in Table] FROM Sales.ShoppingCartItem;
GO
C. Verwenden von OUTPUT INTO mit einer UPDATE-Anweisung
Im folgenden Beispiel werden die ersten zehn Zeilen der VacationHours
-Spalte in der Employee
-Tabelle um 25% aktualisiert. Die OUTPUT
-Klausel gibt den VacationHours
-Wert vor dem Anwenden der UPDATE
-Anweisung in der DELETED.VacationHours
-Spalte sowie den aktualisierten Wert in der INSERTED.VacationHours
-Spalte an die @MyTableVar
table-Variable zurück.
Es folgen zwei SELECT
-Anweisungen, die die Werte in @MyTableVar
sowie die Ergebnisse des Aktualisierungsvorgangs in der Employee
-Tabelle zurückgeben. Die Ergebnisse in der INSERTED.ModifiedDate
-Spalte stimmen nicht mit den Werten in der ModifiedDate
-Spalte der Employee
-Tabelle überein. Der Grund dafür ist ein in der Employee
-Tabelle definierter AFTER UPDATE-Trigger, der den Wert von ModifiedDate
auf das aktuelle Datum aktualisiert. Die von OUTPUT zurückgegebenen Spalten spiegeln jedoch die Daten vor dem Auslösen der Trigger wider.
USE AdventureWorks;
GO
DECLARE @MyTableVar table(
EmpID int NOT NULL,
OldVacationHours int,
NewVacationHours int,
ModifiedDate datetime);
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25
OUTPUT INSERTED.EmployeeID,
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.
--Note that ModifiedDate reflects the value generated by an
--AFTER UPDATE trigger.
SELECT TOP (10) EmployeeID, VacationHours, ModifiedDate
FROM HumanResources.Employee;
GO
D. Verwenden von OUTPUT INTO zum Zurückgeben eines Ausdrucks
Das folgende Beispiel baut auf Beispiel C auf, indem ein Ausdruck in der OUTPUT-Klausel definiert wird, der die Differenz zwischen dem aktualisierten VacationHours
-Wert und dem VacationHours
-Wert vor der Aktualisierung beschreibt. Der Wert dieses Ausdrucks wird an die @MyTableVar
table-Variable in der VacationHoursDifference
-Spalte zurückgegeben.
USE AdventureWorks;
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
OUTPUT INSERTED.EmployeeID,
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) EmployeeID, VacationHours, ModifiedDate
FROM HumanResources.Employee;
GO
E. Verwenden von OUTPUT INTO mit from_table_name in einer UPDATE-Anweisung
Im folgenden Beispiel werden alle Arbeitsaufträge in der ScrapReasonID
-Spalte der WorkOrder
-Tabelle aktualisiert, für die ProductID
und ScrapReasonID
angegeben wurde. Die OUTPUT INTO
-Klausel gibt Werte aus der Tabelle, die aktualisiert wird (WorkOrder
), sowie aus der Product
-Tabelle zurück. Die Product
-Tabelle wird in der FROM-Klausel zur Angabe der zu aktualisierenden Zeilen verwendet. Da für die WorkOrder
-Tabelle ein AFTER UPDATE-Trigger definiert wurde, wird das INTO-Schlüsselwort benötigt.
USE AdventureWorks;
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. Verwenden von OUTPUT INTO mit from_table_name in einer DELETE-Anweisung
Im folgenden Beispiel werden Zeilen in der ProductProductPhoto
-Tabelle auf der Grundlage von in der FROM
-Klausel der DELETE
-Anweisung definierten Suchkriterien gelöscht. Die OUTPUT
-Klausel gibt Spalten aus der Tabelle zurück, die gelöscht wird (DELETED.ProductID
, DELETED.ProductPhotoID
), sowie Spalten aus der Product
-Tabelle. Diese Tabelle wird in der FROM
-Klausel zur Angabe der zu löschenden Zeilen verwendet.
USE AdventureWorks
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. Verwenden von OUTPUT INTO mit einem LOB-Datentyp (Large Object)
Im folgenden Beispiel wird ein Teilwert in DocumentSummary
, eine nvarchar(max)-Spalte in der Production.Document
-Tabelle, mithilfe der .WRITE
-Klausel aktualisiert. Der Begriff components
wird durch den Begriff features
ersetzt, indem der Ersatzbegriff, die Anfangsposition (offset) des zu ersetzenden Begriffs in den vorhandenen Daten und die Anzahl der zu ersetzenden Zeichen (length) angegeben werden. Im Beispiel wird die OUTPUT
-Klausel zur Rückgabe der Anfangs- und Endabbilder der DocumentSummary
-Spalte an die @MyTableVar
table-Variable verwendet. Hierbei werden die vollständigen Anfangs- und Endabbilder der DocumentSummary
-Spalte zurückgegeben.
USE AdventureWorks;
GO
DECLARE @MyTableVar table (
DocumentID int NOT NULL,
SummaryBefore nvarchar(max),
SummaryAfter nvarchar(max));
UPDATE Production.Document
SET DocumentSummary .WRITE (N'features',28,10)
OUTPUT INSERTED.DocumentID,
DELETED.DocumentSummary,
INSERTED.DocumentSummary
INTO @MyTableVar
WHERE DocumentID = 3 ;
SELECT DocumentID, SummaryBefore, SummaryAfter
FROM @MyTableVar;
GO
H. Verwenden von OUTPUT in einem INSTEAD OF-Trigger
Im folgenden Beispiel werden die Ergebnisse des Triggervorgangs mithilfe der OUTPUT-Klausel in einem Trigger zurückgegeben. Zunächst wird eine Sicht in der ScrapReason
-Tabelle erstellt und anschließend ein INSTEAD OF INSERT
-Trigger für die Sicht definiert, die nur zulässt, dass Benutzer die Name
-Spalte der Basistabelle ändern können. Da die ScrapReasonID
-Spalte eine IDENTITY-Spalte in der Basistabelle ist, ignoriert der Trigger den vom Benutzer bereitgestellten Wert. Dadurch kann Datenbankmodul automatisch den richtigen Wert generieren. Darüber hinaus wird der vom Benutzer für ModifiedDate
bereitgestellte Wert ignoriert und auf das aktuelle Datum festgelegt. Die OUTPUT
-Klausel gibt die tatsächlich in die ScrapReason
-Tabelle eingefügten Werte zurück.
USE AdventureWorks;
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
Dies ist das am 12. April 2004 ('2004-04-12'
) generierte Resultset. Die Spalten ScrapReasonIDActual
und ModifiedDate
spiegeln die vom Triggervorgang generierten Werte wider, anstelle der von der INSERT
-Anweisung bereitgestellten Werte.
ScrapReasonID Name ModifiedDate
------------- ---------------- -----------------------
17 My scrap reason 2004-04-12 16:23:33.050
I. Verwenden von OUTPUT INTO mit Identitätsspalten und berechneten Spalten
Im folgenden Beispiel werden die EmployeeSales
-Tabelle erstellt und anschließend mehrere Zeilen mithilfe einer INSERT-Anweisung mit einer SELECT-Anweisung in die Tabelle eingefügt, um Daten aus Quelltabellen abzurufen. Die EmployeeSales
-Tabelle enthält eine Identitätsspalte (EmployeeID
) sowie eine berechnete Spalte (ProjectedSales
). Da diese Werte während des Einfügevorgangs von SQL Server-Datenbankmodul generiert werden, kann keine dieser Spalten in @MyTableVar
definiert werden.
USE AdventureWorks ;
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(
LastName nvarchar(20) NOT NULL,
FirstName nvarchar(20) NOT NULL,
CurrentSales money NOT NULL
);
INSERT INTO dbo.EmployeeSales (LastName, FirstName, CurrentSales)
OUTPUT INSERTED.LastName,
INSERTED.FirstName,
INSERTED.CurrentSales
INTO @MyTableVar
SELECT c.LastName, c.FirstName, sp.SalesYTD
FROM HumanResources.Employee AS e
INNER JOIN Sales.SalesPerson AS sp
ON e.EmployeeID = sp.SalesPersonID
INNER JOIN Person.Contact AS c
ON e.ContactID = c.ContactID
WHERE e.EmployeeID LIKE '2%'
ORDER BY c.LastName, c.FirstName;
SELECT LastName, FirstName, CurrentSales
FROM @MyTableVar;
GO
SELECT EmployeeID, LastName, FirstName, CurrentSales, ProjectedSales
FROM dbo.EmployeeSales;
GO
J. Verwenden von OUTPUT und OUTPUT INTO in einer einzelnen Anweisung
Im folgenden Beispiel werden Zeilen in der ProductProductPhoto
-Tabelle auf der Grundlage von in der FROM
-Klausel der DELETE
-Anweisung definierten Suchkriterien gelöscht. Die OUTPUT INTO
-Klausel gibt Spalten aus der Tabelle, die gelöscht wird (DELETED.ProductID
, DELETED.ProductPhotoID
), sowie Spalten aus der Product
-Tabelle an die @MyTableVar
table-Variable zurück. Die Product
-Tabelle wird in der FROM
-Klausel zur Angabe der zu löschenden Zeilen verwendet. Die OUTPUT
-Klausel gibt die Spalten DELETED.ProductID
und DELETED.ProductPhotoID
sowie das Datum und die Uhrzeit des Löschens der Zeile aus der ProductProductPhoto
-Tabelle an die aufrufende Anwendung zurück.
USE AdventureWorks
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
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
Siehe auch
Verweis
DELETE (Transact-SQL)
INSERT (Transact-SQL)
UPDATE (Transact-SQL)
table (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
sp_configure (Transact-SQL)
Hilfe und Informationen
Informationsquellen für SQL Server 2005
Änderungsverlauf
Version | Verlauf |
---|---|
12. Dezember 2006 |
|