2012-07-12 78 views
0

我已经写代码复位所有表的标识为1,但在某些表的身份没有重置为1,否则,将重置为0或2或其他数字 这是我的代码重置所有Identites 1

declare @Count int 
    declare @C int 
    declare @Str varchar(20) 
    set @C=1 
    set @Count=(select COUNT(*) TABLE_NAME from INFORMATION_SCHEMA.TABLES) 
    while @C<@Count 
    BEGIN 
     with Records AS(select row_number() over(order by TABLE_NAME) as 'row1', * 
        from INFORMATION_SCHEMA.TABLES) 
     select @Str= TABLE_NAME from records 
     where [email protected] 
     set @[email protected]+1 
     DBCC CHECKIDENT (@Str , reseed, 0) 
    END 
+0

检查这里: [http://stackoverflow.com/questions/724668/sql-server-identity-column-values-start-at-0-instead-of-1][1 ] [1]:http://stackoverflow.com/questions/724668/sql-server-identity-column-values-start-at-0-instead-of-1 – 2012-07-12 20:31:09

+0

只需使用一个光标。 while循环效率非常低。 – 2012-07-15 08:53:31

回答

0

gbn。已经表示如果自从创建表后没有行插入到表中,或者使用TRUNCATE TABLE语句删除了所有行,则在运行DBCC CHECKIDENT之后插入的第一行使用new_reseed_value作为标识。否则,插入的下一行使用new_reseed_value +当前增量值,但我们希望将所有标识重置为1.任何人都完成了它?

0

假设你所有的表都是空的,这应该适合你。它定义了IDENTITY(1,1),并循环遍历所有表格,除了那些从未插入过行或已被截断并且不需要种子的行。

DECLARE @Name NVARCHAR(1000) 
DECLARE @C1 AS CURSOR; 

SET @C1 = CURSOR FAST_FORWARD 
FOR SELECT Quotename(Object_schema_name(object_id)) + '.' 
       + Quotename(Object_name(object_id)) 
    FROM sys.identity_columns 
    WHERE Objectpropertyex(object_id, 'IsUserTable') = 1 
      AND seed_value = 1 
      AND increment_value = 1 
      AND last_value IS NOT NULL; 

OPEN @C1; 

FETCH NEXT FROM @C1 INTO @Name; 

WHILE @@FETCH_STATUS = 0 
    BEGIN 
     DBCC CHECKIDENT (@Name, reseed, 0) 

     FETCH NEXT FROM @C1 INTO @Name; 
    END