0

すべてのテーブルの ID を 1 にリセットするコードを書きましたが、一部のテーブルでは ID が 1 にリセットされず、それ以外の場合は 0 または 2 または他の数値にリセットされます。これが私のコードです。

    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 row1=@C
        set @C=@C+1
        DBCC CHECKIDENT (@Str , reseed, 0)
    END 
4

2 に答える 2

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 
于 2012-07-15T09:23:44.137 に答える
0

gbn。テーブルが作成されてから行が挿入されていない 場合、または TRUNCATE TABLE ステートメントを使用してすべての行が削除されている場合、DBCC CHECKIDENT を実行した後に挿入される最初の行は、new_reseed_value を ID として使用します。それ以外の場合、挿入される次の行は new_reseed_value + 現在のインクリメント値 を使用しますが、すべての ID を 1 にリセットしたいと考えています。

于 2012-07-15T06:39:23.990 に答える