• 自动生成清空数据库的SQL语句(V2.0)


    之前写的那脚本没有注意到这重置标识值的问题。

    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,0as 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

  • 相关阅读:
    COJ979 WZJ的数据结构(负二十一)
    COJ980 WZJ的数据结构(负二十)
    奇怪的错误
    COJ883 工艺品
    COJ885 LCS???
    COJ559 回文
    hdu1505(dp求最大子矩阵)
    hdu1506(dp求最大子矩阵)
    hdu2569(递推dp)
    hdu1081(最大子矩阵)
  • 原文地址:https://www.cnblogs.com/wghao/p/1306662.html
Copyright © 2020-2023  润新知