自動インクリメントID列を持つT-SQL テーブル変数(テーブルではない)があります。この変数からすべてのデータを消去し、ID列の値を1にリセットしたいのですが、どうすればよいですか?
テーブル変数を使用している場合、それはできません。テーブルの場合は、切り捨てるか、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
テーブル変数でできることは最高です。
テーブルを切り捨てると、すべてのデータがダンプされ、IDシードがリセットされます。
それ以外の場合は、この呼び出しを使用して、任意のデータを保持しながらIDをリセットできます。
DBCC CHECKIDENT (yourtableName, reseed, @NewStartSeedValue)
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」などとして挿入することができます。
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
お役に立てれば