OUTPUT 作用在INSERT,UPDATE,DELETE后

返回受 INSERT、UPDATE、DELETE 或 MERGE 语句影响的各行中的信息,或返回基于受这些语句影响的各行的表达式。这些结果可以返回到处理应用程序,以供在确认消息、存档以及其他类似的应用程序要求中使用。也可以将这些结果插入表或表变量。另外,您可以捕获嵌入的 INSERT、UPDATE、DELETE 或 MERGE 语句中 OUTPUT 子句的结果,然后将这些结果插入目标表或视图。

 

SQL Server 2005 新增了一個 OUTPUT 子句的功能,你可以在 UPDATE 或  DELETE 子句中得到執行指令過後的資料,例如你想得知 UPDATE 某筆資料列時,該筆資料列更新前後的欄位值,此時,便可利用 OUTPUT 子句來解決了。

UPDATE 子句的應用,在此之前必須先了解當你執行 UPDATE 指令時,會同時記錄在資料庫裡的兩個虛擬資料表,分別是 deleted 舊的記錄表、Inserted 新的紀錄表。

因此資料庫的處理中實際上會包含紀錄原資料表內欲更新的資料列到 deteted 虛擬資料表,然後 delete 原資料表的資料列,然後再由 Inserted 虛擬資料表中 insert 新的資料列到原資料表中。

 

如果要在 DELETE 指令使用 OUTPUT 的話,僅能使用 deleted 虛擬資料表,方法可參考上述的 UPDATE 指令即可。

DELETE Sales.ShoppingCartItem
OUTPUT DELETED.*;

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

--A. 将 OUTPUT INTO 用于简单 INSERT 语句
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. 将 OUTPUT 用于 DELETE 语句
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. 将 OUTPUT INTO 用于 UPDATE 语句
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 

 

帮助文件的URL:ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.zh-CHS/s10de_6tsql/html/41b9962c-0c71-4227-80a0-08fdc19f5fe4.htm

posted @ 2010-02-24 10:47  db's jim  阅读(459)  评论(0编辑  收藏  举报