辅导:SQL2005使用OUTPUT子句捕获数据插入时的标识值
来源:优易学  2011-10-31 12:53:56   【优易学:中国教育考试门户网】   资料下载   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
  Product表有个ID字段作为主键。Productnumber是Product表中一个自然键。 ProductsToInsert表的有ProductNumber字段以及另外记录标识值的字段,向产品表插入记录时将会在该字段中记录标识值。
  上面语句中,只取了450条产品信息作为Product数据表的初始化数据,取了全部504条记录作为ProductsToInsert数据表的初始化数据。
  use tempdb
  GO
  INSERT Product ([Name], ProductNumber, ListPrice)
  SELECT
  [Name], ProductNumber, ListPrice
  FROM
  ProductsToInsert I
  WHERE
  NOT EXISTS (SELECT 1
  FROM Product
  WHERE ProductNumber = I.ProductNumber)
  该语句执行完后,在以前的表中不存在的54种产品将被插入到product表中。

[1] [2] 下一页

责任编辑:小草

文章搜索:
 相关文章
热点资讯
热门课程培训