SQL 2005使用OUTPUT子句捕获数据插入时的标识值

在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

时间: 2024-08-03 10:26:54

SQL 2005使用OUTPUT子句捕获数据插入时的标识值的相关文章

sql排序分页 如果有新数据插入

问题描述 sql排序分页 如果有新数据插入 sql排序分页 如果有新数据插入并且排序在前面,那取第二页的时候就会有重复数据,而且新插入的数据展示不出来了,怎么解决呢? 各位可能没理解我意思: 比如说现在数据库里面几千万数据,还是实时插入的数据,我想排序后分页取,比如说第一次通过代码给数据库传参取第一页,取100条, 1.这个过程数据库是把所有数据几千万条全部load到内存中排序,然后进行分页,然后取出前100条吗? 2.那第二次,还会再load所有数据一次重新排一次序,再取出101-200之间的

sql server 2000 一个表的数据插入到三个相关联表中,一条一条的插入

FROM http://www.cnblogs.com/geovindu/archive/2009/07/03/1516159.html 1/**//********************************************************** 2测试数据 sql server 2000 一个表的数据插入到三个相关联表中,一条一条的插入 3---涂聚文 缔友计算机信息技术有限公司 软件工程师 geovindu@163.com www.dupcit.com 4---捷为工作室

SQLServer2005 Output子句获取刚插入的ID值_mssql2005

语法很简单,比如 复制代码 代码如下: declare @t table (id uniqueidentifier default newid (), name varchar (100 )) insert into @t (name ) output inserted .id select 'jinjazz' union select 'sqlserver' /*输出类似 3880DB77-5ADF-472D-A68D-7518DD76F3B8 F478A3F5-A501-404E-A328-

在线求助,两台数据库数据插入时同步

问题描述 两个数据库A和B当向A中插入数据时,B也同时插入. 解决方案 解决方案二:触发器..6个字符串...解决方案三:可以用触发器解决方案四:引用1楼yyantifa的回复: 触发器..6个字符串... 这个我也知道,但是具体需要怎么做不清楚,有没有这方面的例子可以看一下.解决方案五:如,楼上几位说的,触发器,插入数据库A中某表时对其做一个触发器,触发器的任务就是A库中表变化就向数据库B中某表插入数据.解决方案六: 解决方案七:如果表多有點麻煩哦,如果及時性要求不是很嚴,可以考慮用複寫解决方

sql使用触发器当一张表插入数据就往另一张表插入数据

问题描述 sql使用触发器当一张表插入数据就往另一张表插入数据 日期格式是这样的但是使用触发器当上图插入了一条数据就往下图插入相同的数据,如下图为什么日期格式不一样呢? 解决方案 SQL(二) 将一张表数据插入另外一张表从表中插入数据到另外一张表oracle 将一张表的数据插入到另一张表 解决方案二: 日期格式的问题,先确保两张表对应列的数字类型一致,插入使用convert格式化一下:CONVERT(varchar(10), GETDATE(), 111).

在ASP.NET中访问SQL 2005报表服务

在ASP.NET中,有多种方法可以访问SQL 2005的报表服务. 方法一: 通过ReportView控件 首先,安装ReportView控件.如果你使用的是SQL 2000报表服务器,到这个目录去找到源码工程 C:\Program Files\Microsoft SQL Server\MSSQL\Reporting Services\Samples\Applications\ReportViewer\vb and C:\Program Files\Microsoft SQL Server\MS

SQL SERVER 2000 中的标识值获取函数

server|函数 IDENTITY(标识)列,也有很多人称之为自增列,在SQL Server 2000中,标识列通过IDENTITY来定义,下面是与获取最后插入记录的标识值有关的函数的一个示例说明     SQL Server 中,可以使用 SCOPE_IDENTITY(). @@IDENTITY . IDENT_CURRENT() 来取得最后插入记录的值值,它们的区别在于:SCOPE_IDENTITY() 返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值.一个

SQL Server 2005数据库中的Output子句

SQL Server 2005中的output子句,可以使你从修改语句(insert.update. delete)中将数据返回到表变量中.带结果的DML的有用方案包括清除和存档.消 息处理应用程序以及其他方案.这一新的OUTPUT子句的语法为: OUTPUT INTO @table_variable 可以通过引用插入的表和删除的表来访问被修改的 行的旧/新映像,其方式与访问触发器类似.在 insert语句中,只能访问插入的 表.在delete语句中,只能访问删除的表.在update语句中,可以

在SQL 2005中用T-SQL插入中文数据时出现的问号或乱码的解决方案[转]

在SQL 2005中用T-SQL插入中文数据时出现的问号或乱码的解决方案 病症表现为:主要表现为用T-sql语句插入中文数据时数据库显示全是问号"???" 解决办法: 第一种办法:先选中出错的数据库→选中以后右键点击属性会弹出数据库属性 对话框→选中数据库属性对话框中的选项→把选项中的排序规则设置成:Chinese_PRC_90_CI_AS→最后点击确定即可.(注意:在选择数据库属性的时候必须确保你所修改的数据库未被使用才可以修改否则会失败的) 第二种办法:首先打开你的sql查询分析器