web-dev-qa-db-ja.com

T-SQLテーブル変数のID列を再シードするにはどうすればよいですか?

自動インクリメントID列を持つT-SQL テーブル変数(テーブルではない)があります。この変数からすべてのデータを消去し、ID列の値を1にリセットしたいのですが、どうすればよいですか?

33
Nimesh Madhavan

テーブル変数を使用している場合、それはできません。テーブルの場合は、切り捨てるか、DBCC CHECKIDENTを使用できます。ただし、haveを使用してテーブル変数を使用する場合は、ID列以外のものを使用する必要があります。または、より正確には、テーブル変数でID列を使用しますが、ROWNUMBERを使用して出力します。

DECLARE @t table (pkint int IDENTITY(1,1), somevalue nvarchar(50))
INSERT INTO @t (somevalue) VALUES( 'one')
INSERT INTO @t (somevalue) VALUES('twp')
INSERT INTO @t (somevalue) VALUES('three')
SELECT row_number() OVER (ORDER BY pkint), somevalue FROM @t
DELETE FROM @t
INSERT INTO @t (somevalue) VALUES('four')
SELECT row_number() OVER (ORDER BY pkint), somevalue FROM @t

テーブル変数でできることは最高です。

34
Josef

テーブルを切り捨てると、すべてのデータがダンプされ、IDシードがリセットされます。

それ以外の場合は、この呼び出しを使用して、任意のデータを保持しながらIDをリセットできます。

DBCC CHECKIDENT (yourtableName, reseed, @NewStartSeedValue)
35
    declare @tb table (recid int,lineof int identity(1,1))

    insert into @tb(recid)
    select recid from tabledata 

    delete from @tb where lineof>(select min(lineof) from @tb)+@maxlimit

SQL 2000を使用するときにTOPと変数を使用したいときにこれを行いました。基本的に、レコードを追加してから、最小のレコードを確認します。私は同じ問題を抱えていて、このスレッドに気付きました。テーブルを削除してもシードはリセットされませんが、GOを使用してシードをリセットするにはテーブルと変数を削除する必要があると思います。

上記のクエリの@maxlimitはクエリの上位900を取得するためのもので、テーブル変数の開始IDキーが異なるため、この問題は解決します。

後続のクエリは、その派生プロシージャを減算して「1」などとして挿入することができます。

0
Lauren Glenn

2つのテーブル変数を使用することをお勧めします。 @ Table1の最初の列にはIDシードがあります。 @ Table2の最初の列は同じですが、IDシードはありません。

プロセスをループすると、

Insert into @Table2 from @Table1

次に、プロセスループとして両方のテーブルから削除します。

最初のパスでは、@ Table2の最初の行に1から始まる連番が付きます。

2回目のループでは、2番目のテーブルの最初の列に、たとえば1081から始まる連続番号が含まれている場合があります。ただし、変数に最小値を選択した場合、

(Select @FixSeed = min(RowID) From @Table2)

次に、@ Table2を更新して、次のようにRowIDを1から開始します。

Update @Table2  Set  RowID = RowID - @FixSeed +1

お役に立てれば

0
Pavlo Carerra