2012-07-12 2 views
0

내가 작성한 코드에 모든 테이블의 신원을 모든 Identites 재설정하지만 일부 테이블에 정체성 그렇지 않으면 1로 재설정하지 않고, 0 또는 2 또는 다른 숫자이 내 코드 재설정됩니다1로 리셋 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 –

+0

그냥 커서를 사용합니다. While 루프는 매우 비효율적입니다. –

답변

0

gbn. has 테이블이 만들어진 후 테이블에 삽입 된 행이 없거나 TRUNCATE TABLE 문을 사용하여 모든 행이 제거 된 경우 DBCC CHECKIDENT를 실행 한 후 삽입 된 첫 번째 행은 new_reseed_value를 ID로 사용합니다. 그렇지 않으면 삽입 된 다음 행은 new_reseed_value + 현재 증가 값을 사용하지만 모든 ID를 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