透過MSSQL嗅探器跟蹤研究EM內部行為並解決identify列問題

sqysl發表於2016-07-06

今天有人問到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的思路肯定是這麼實現的。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8484829/viewspace-2121624/,如需轉載,請註明出處,否則將追究法律責任。

相關文章