之前写的那脚本没有注意到这重置标识值的问题。
1、当我们向一个含有标识列的表插入数据后,再执行
Delete
From
TableName
DBCC
Checkident (
'
TableName
'
,Reseed,
0
)
然后插入新数据,开始值是从1开始。这样处理是正确的。
2、当我们新建一个表,在没有插入数据,就执行
Delete
From
TableName
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
*/
第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
*/
为了解决这样的开始值为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
*/
因此,以前写的自动生成清空数据库的SQL语句脚本纠正如下:
/*自动生成清空数据库的SQL语句(V2.0) Andy 2008-10-8*/
Use Test
Go
Declare
@Sql
nvarchar
(
Max
)
;
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