在insert語句或者delete語句執行後,SQL Server只返回受影響的記錄行的總數,如果我們想知道到底所插入/所刪除的記錄的具體信息的話,這就有點復雜了。在SQL Server 2005之前的版本中,如果希望從已插入和已刪除的虛擬表中捕獲數據,我們只能通過觸發器來實現。在SQL Server 2005中,我們可以利用OUTPUT子句來實現這個功能。我們可以在insert ... SELECT語句使用OUTPUT子句,捕獲所有插入的標識值。以前這需要某種類型的循環或暫時改變目標表才能實現。
下面通過具體例子來詳細介紹如何使用OUTPUT子句。
我們新建兩個數據表:一個product產品表,一個ProductsToInsert待插入的產品表。假設供應商向您發送了一個完整的列出所有的產品,但你只需要插入之前不存在的記錄。並且你需要將這些新行插入到多個表格中。
下面的腳本將根據AdventureWorks數據庫中的記錄,在tempdb數據庫中創建表。
USE tempdb
GO
IF EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[Product]') AND type in (N'U'))
DROP TABLE [dbo].[Product]
GO
IF EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].ProductsToInsert') AND type in (N'U'))
DROP TABLE [dbo].ProductsToInsert
GO
--創建Product表
CREATE TABLE Product (
ProductID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
[Name] NVARCHAR(50) NOT NULL,
ProductNumber NVARCHAR(25) NOT NULL,
ListPrice MONEY NOT NULL)
GO
CREATE UNIQUE INDEX IX_Product_ProductNumber ON Product ( ProductNumber )
GO
--創建ProductsToInsert表
CREATE TABLE ProductsToInsert (
RowID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
[Name] NVARCHAR(50) NOT NULL,
ProductNumber NVARCHAR(25) NOT NULL,
ListPrice MONEY NOT NULL,
InsertedIdentityValue INT NULL)
GO
--向Product表插入數據
INSERT Product ([Name], ProductNumber, ListPrice)
SELECT TOP 450 [Name], ProductNumber, ListPrice
FROM AdventureWorks.Production.Product
ORDER BY SellStartDate, ProductID
GO
--向ProductToInsert表插入數據
INSERT ProductsToInsert ([Name], ProductNumber, ListPrice)
SELECT [Name], ProductNumber, ListPrice
FROM AdventureWorks.Production.Product
GO