通过MSSQL分析器跟踪研究EM内部行为并解决identify列问题

本文介绍了一种在MSSQL中复制带有IDENTITY字段的表的方法,通过设置IDENTITY_INSERT为ON并使用T-SQL语句直接指定IDENTITY值来保持原有数据的IDENTITY值不变,同时确保新插入数据的IDENTITY值正常增长。

今天有人问到MSSQL表里的IDENTITY字段,如何让它在复制原来数据到该表时,原来数据的IDENTITY字段不变,而新插入数据时,新插入的数据的IDENTITY依然增长,查了些资料,做了个实验,最终解决,实验过程脚本如下: 
use test1 
go 
drop table t1 
drop table t2 
go 
create table t1(col1 int identity(100,1),col2 char(100)) 
create table t2(col1 int identity(1,1) not for replication,col2 char(100)) 
go 
insert into t1 values('aaaaa') 
insert into t1 values('bbbbbb') 
insert into t1 values('cccccc') 
go 
set identity_insert t2 on 
insert into t2(col1) select col1 from t1 
go 
DBCC CHECKIDENT(t2,RESEED,1) 
go 
insert into t2('eeeeee') 
insert into t2('rrrrrr') 
go 
select * from t2 
go
晚上回家后,发现他针对该问题又提出了疑问,于是就决定对MSSQL的企业管理器中进行该操作进行了跟踪,主要是t-sql和procedure,结果发现和昨晚几乎差不多:
CREATE TABLE dbo.Tmp_Table_1
(
c1 int NOT NULL IDENTITY (50, 1000),
c2 char(10) NULL
)  ON [PRIMARY]
SET IDENTITY_INSERT dbo.Tmp_Table_1 ON
IF EXISTS(SELECT * FROM dbo.Table_1)
  EXEC('INSERT INTO dbo.Tmp_Table_1 (c1, c2)
  SELECT c1, c2 FROM dbo.Table_1 WITH (HOLDLOCK TABLOCKX)')
SET IDENTITY_INSERT dbo.Tmp_Table_1 OFF
DROP TABLE dbo.Table_1
EXECUTE sp_rename N'dbo.Tmp_Table_1', N'Table_1', 'OBJECT' 
最后,他又提出了如果原表有约束和二进制数据的问题,那也只能是一步步实现了,比较麻烦,但MSSQL的EM的思路肯定是这么实现的。

转载于:https://www.cnblogs.com/lhdz_bj/p/9067856.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值