sql server 帶有OUTPUT的INSERT,DELETE,UPDATE

weixin_34054866發表於2018-05-29
原文:sql server 帶有OUTPUT的INSERT,DELETE,UPDATE

OUTPUT是SQL SERVER2005的新特性.可以從資料修改語句中返回輸出.可以看作是"返回結果的DML".INSERT,DELETE,UPDATE均支援OUTPUT子句.在OUTPUT子句中,可以引用特殊表inserted和deleted.使用inserted和deleted表與在觸發器中使用的非常相似. 

在INSERT,DELETE,UPDATE中OUTPUT的區別 

1.對於INSERT,可以引用inserted表以查詢新行的屬性.

2.對於DELETE,可以引用deleted表以查詢舊行的屬性.

3.對於UPDATE,使用deleted表查詢被更新行在更改前的屬性,用inserted表標識被更新行在更改後的值.  

輸出方式: 

1.可以輸出給呼叫方(客戶端應用程式)

2.輸出給表

3.兩者皆可. 

應用:  

一.帶有OUTPUT的INSERT的應用 

對於包含自增列的表執行多行insert語句,同時想知道新的標識值時,在INSERT中使用OUTPUT子句非常方便.對於單行INSERT語句,這不成問題:SCOPE_IDENTITY函式即可實現. 

  1. -- Generating Surrogate Keys for Customers  
  2. USE tempdb;  
  3. GO  
  4. IF OBJECT_ID('dbo.CustomersDim'IS NOT NULL  
  5.   DROP TABLE dbo.CustomersDim;  
  6. GO  
  7.   
  8. CREATE TABLE dbo.CustomersDim  
  9. (  
  10.   KeyCol      INT          NOT NULL IDENTITY PRIMARY KEY,  
  11.   CustomerID  NCHAR(5)     NOT NULL,  
  12.   CompanyName NVARCHAR(40) NOT NULL,  
  13.   /* ... other columns ... */  
  14. );  
  15.   
  16. -- Insert New Customers and Get their Surrogate Keys  
  17. DECLARE @NewCusts TABLE  
  18. (  
  19.   CustomerID NCHAR(5) NOT NULL PRIMARY KEY,  
  20.   KeyCol     INT      NOT NULL UNIQUE  
  21. );  
  22.   
  23. INSERT INTO dbo.CustomersDim(CustomerID, CompanyName)  
  24.     OUTPUT inserted.CustomerID, inserted.KeyCol  
  25.     INTO @NewCusts  
  26.     -- OUTPUT inserted.CustomerID, inserted.KeyCol  
  27.   SELECT CustomerID, CompanyName  
  28.   FROM Northwind.dbo.Customers  
  29.   WHERE Country = N'UK';  
  30.   
  31. SELECT CustomerID, KeyCol FROM @NewCusts;  
  32. GO  

注意程式碼中被註釋掉的第二個OUTPUT子句,後面沒有INTO子句.如果還要輸出返回給呼叫方,取消註釋即可.這樣,INSERT語句將包含兩個OUTPUT子句. 

示例2. 

  1. USE AdventureWorks;  
  2. GO 

  3. CREATE TABLE TestTable (ID INT, TEXTVal VARCHAR(100))  
  4. DECLARE @TmpTable TABLE (ID INT, TEXTVal VARCHAR(100))  
  5.  
  6. INSERT TestTable (ID, TEXTVal)  
  7. OUTPUT Inserted.ID, Inserted.TEXTVal INTO @TmpTable  
  8. VALUES (1,'FirstVal')  
  9. INSERT TestTable (ID, TEXTVal)  
  10. OUTPUT Inserted.ID, Inserted.TEXTVal INTO @TmpTable  
  11. VALUES (2,'SecondVal')  
  12.  
  13. SELECT * FROM @TmpTable  
  14. SELECT * FROM TestTable  
  15.  
  16. DROP TABLE TestTable  
  17. GO  
  1. USE AdventureWorks;  
  2. GO  
  3. CREATE TABLE TestTable (ID INT, TEXTVal VARCHAR(100))  
  4.  
  5. INSERT TestTable (ID, TEXTVal)  
  6. OUTPUT Inserted.ID, Inserted.TEXTVal  
  7. VALUES (1,'FirstVal')  
  8. INSERT TestTable (ID, TEXTVal)  
  9. OUTPUT Inserted.ID, Inserted.TEXTVal  
  10. VALUES (2,'SecondVal')  
  11. DROP TABLE TestTable  
  12. GO  

二.帶有OUTPUT的DELETE的應用. 

如果要刪除資料的同時,還需要記錄日誌,或者歸檔資料.在DELETE中使用OUTPUT子句在適合不過了. 

  1. USE AdventureWorks;  
  2. GO  
  3. CREATE TABLE TestTable (ID INT, TEXTVal VARCHAR(100))  
  4. DECLARE @TmpTable TABLE (ID INT, TEXTVal VARCHAR(100))  
  5. INSERT TestTable (ID, TEXTVal)  
  6. VALUES (1,'FirstVal')  
  7. INSERT TestTable (ID, TEXTVal)  
  8. VALUES (2,'SecondVal')  
  9.  
  10. DELETE  
  11. FROM TestTable  
  12. OUTPUT Deleted.ID, Deleted.TEXTVal INTO @TmpTable  
  13. WHERE ID IN (1,2)  
  14.  
  15. SELECT * FROM @TmpTable  
  16. SELECT * FROM TestTable  
  17. DROP TABLE TestTable  
  18. GO  

三.帶有OUTPUT的UPDATE的應用  

  1. USE AdventureWorks;  
  2. GO  
  3. CREATE TABLE TestTable (ID INT, TEXTVal VARCHAR(100))  
  4. DECLARE @TmpTable TABLE (ID_New INT, TEXTVal_New VARCHAR(100),ID_Old INT, TEXTVal_Old VARCHAR(100))  
  5. INSERT TestTable (ID, TEXTVal)  
  6. VALUES (1,'FirstVal')  
  7. INSERT TestTable (ID, TEXTVal)  
  8. VALUES (2,'SecondVal')  
  9. UPDATE TestTable  
  10. SET TEXTVal = 'NewValue'  
  11. OUTPUT Inserted.ID, Inserted.TEXTVal, Deleted.ID, Deleted.TEXTVal INTO @TmpTable  
  12. WHERE ID IN (1,2)  
  13.  
  14. SELECT * FROM @TmpTable  
  15. SELECT * FROM TestTable  
  16. DROP TABLE TestTable  
  17. GO  

相關文章