SQL 2005使用OUTPUT子句捕获数据插入时的标识值2010-06-16 IT专家网 林善茂在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