之前写的那脚本没有注意到这重置标识值的问题。
1、当我们向一个含有标识列的表插入数据后,再执行
Delete
From
TableName
DBCC Checkident ( ' TableName ' ,Reseed, 0 )
DBCC Checkident ( ' TableName ' ,Reseed, 0 )
然后插入新数据,开始值是从1开始。这样处理是正确的。
2、当我们新建一个表,在没有插入数据,就执行
Delete
From
TableName
DBCC Checkident ( ' TableName ' ,Reseed, 0 )
DBCC Checkident ( ' TableName ' ,Reseed, 0 )
然后插入新数据,开始值就会从0开始。这样的结果,就不是我们预期要求的结果了。
下面做一个测试:
第一种情况:
Use
test
Go
Set Nocount On
If Object_id ( ' test ' ) Is Not null
Drop Table test
Go
Create Table test(id int Identity ( 1 , 1 ))
Insert test Default Values
Insert test Default Values
Insert test Default Values
Delete From test
Dbcc Checkident ( ' test ' ,reseed, 0 )
Insert test Default Values
Dbcc Checkident ( ' test ' ,noreseed)
Select * From test
/*
检查标识信息: 当前标识值 '3',当前列值 '0'。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
检查标识信息: 当前标识值 '1',当前列值 '1'。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
id
-----------
1
*/
Go
Set Nocount On
If Object_id ( ' test ' ) Is Not null
Drop Table test
Go
Create Table test(id int Identity ( 1 , 1 ))
Insert test Default Values
Insert test Default Values
Insert test Default Values
Delete From test
Dbcc Checkident ( ' test ' ,reseed, 0 )
Insert test Default Values
Dbcc Checkident ( ' test ' ,noreseed)
Select * From test
/*
检查标识信息: 当前标识值 '3',当前列值 '0'。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
检查标识信息: 当前标识值 '1',当前列值 '1'。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
id
-----------
1
*/
第2种情况:
Use
test
Go
Set Nocount On
If Object_id ( ' test ' ) Is Not null
Drop Table test
Go
Create Table test(id int Identity ( 1 , 1 ))
Dbcc Checkident ( ' test ' ,reseed, 0 )
Insert test Default Values
Dbcc Checkident ( ' test ' ,noreseed)
Select * From test --这里我们会发现开始值是0
/*
检查标识信息: 当前标识值 'NULL',当前列值 '0'。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
检查标识信息: 当前标识值 '0',当前列值 '0'。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
id
-----------
0
*/
Go
Set Nocount On
If Object_id ( ' test ' ) Is Not null
Drop Table test
Go
Create Table test(id int Identity ( 1 , 1 ))
Dbcc Checkident ( ' test ' ,reseed, 0 )
Insert test Default Values
Dbcc Checkident ( ' test ' ,noreseed)
Select * From test --这里我们会发现开始值是0
/*
检查标识信息: 当前标识值 'NULL',当前列值 '0'。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
检查标识信息: 当前标识值 '0',当前列值 '0'。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
id
-----------
0
*/
为了解决这样的开始值为0问题,必须重置标识值为null
解决如下:
Use
test
Go
Set Nocount On
If Object_id ( ' test ' ) Is Not null
Drop Table test
Go
Create Table test(id int Identity ( 1 , 1 ))
Declare @null int --借助一个null值的变量来重置表标识值为null
Dbcc Checkident ( ' test ' ,reseed, @null )
Insert test Default Values
Dbcc Checkident ( ' test ' ,noreseed)
Select * From test
/*
检查标识信息: 当前标识值 'NULL',当前列值 'NULL'。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
检查标识信息: 当前标识值 '1',当前列值 '1'。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
id
-----------
1
*/
Go
Set Nocount On
If Object_id ( ' test ' ) Is Not null
Drop Table test
Go
Create Table test(id int Identity ( 1 , 1 ))
Declare @null int --借助一个null值的变量来重置表标识值为null
Dbcc Checkident ( ' test ' ,reseed, @null )
Insert test Default Values
Dbcc Checkident ( ' test ' ,noreseed)
Select * From test
/*
检查标识信息: 当前标识值 'NULL',当前列值 'NULL'。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
检查标识信息: 当前标识值 '1',当前列值 '1'。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
id
-----------
1
*/
因此,以前写的自动生成清空数据库的SQL语句脚本纠正如下:
/*自动生成清空数据库的SQL语句(V2.0) Andy 2008-10-8*/
Use Test
Go
; With T1
As
(
Select Convert ( int , 0 ) as LevelNo,fkeyid,rkeyid
From sys.sysforeignkeys a
Where Not Exists ( Select 1 From sys.sysforeignkeys Where rkeyid = a.fkeyid)
Union All
Select b.LevelNo + 1 ,a.fkeyid,a.rkeyid
From sys.sysforeignkeys a,T1 b
Where a.fkeyid = b.rkeyid
)
,T2
As
(
Select LevelNo,id = fkeyid From T1
Union All
Select LevelNo + 1 ,rkeyid From T1
)
,T3
As
(
Select a.name,LevelNo = Max ( Isnull (b.LevelNo, 0 )),c.is_identity
From sys.sysobjects a
Left Outer Join T2 b On a.id = b.id
Left Outer Join sys.identity_columns c On c. object_id = a.id
Where a.xtype = ' U ' And a.name <> ' sysdiagrams '
Group By a.name,c.is_identity
)
Select @Sql = Isnull ( @Sql , ' Use ' + Quotename ( Db_name ()) + Char ( 13 ) + Char ( 10 ) + ' Declare @null int ' ) + char ( 13 ) + char ( 10 ) +
Case When LevelNo = 0 Then ' Truncate Table ' + Quotename (name)
When is_identity = 1 Then ' Delete From ' + Quotename (name) + ' DBCC Checkident ( ''' + Quotename (name) + ''' ,Reseed,@null) '
Else ' Delete From ' + Quotename (name) End
From T3
Order By LevelNo
Option (Maxrecursion 0 )
Print @Sql