Как я могу переустановить столбец идентификатора в переменной таблицы T-SQL?

У меня есть T-SQL переменной в таблице (не таблица), которая имеет столбец, автоматически увеличивая личности. Я хочу очистить все данные от этой переменной и сбросить значение столбца идентификатора до 1. Как это сделать?

6 ответов


Если вы используете переменную таблицы, вы не можете этого сделать. Если бы это была таблица, вы могли бы обрезать ее или использовать DBCC CHECKIDENT. Но если ты ... --4-->есть использовать табличную переменную, вы должны использовать что-то другое, чем столбец идентификаторов. Или, точнее, используйте столбец identity в переменной таблицы, но выводите с помощью 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

Это лучшее, что вы можете сделать с переменной таблицы.


усечение таблицы сбросит все данные и сбросит семя идентификатора.

в противном случае вы можете использовать этот вызов для сброса идентификатора при сохранении любых данных:

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

Я сделал это, когда хотел использовать TOP и переменную при использовании SQL 2000. В принципе, вы добавляете записи, а затем смотрите на минимальный. У меня была такая же проблема, и я заметил эту тему. Удаление таблицы не сбрасывает семя, хотя я предполагаю, что использование GO должно отбросить таблицу и переменную для сброса семени.

@maxlimit в приведенном выше запросе должен был получить верхний 900 запроса, и поскольку переменная таблицы будет иметь другой начальный ключ идентификации, это это решит проблему.

любой последующий запрос может вычесть эту производную процедуру, чтобы вставить ее как "1"и т. д.

надеюсь, что это помогает.

Лорен


Я предлагаю вам использовать две переменные стол. @ Table1 имеет семя идентификатора в первом столбце. @Table2 имеет тот же первый столбец, но на нем нет идентификатора.

как вы цикл через ваш процесс,

Insert into @Table2 from @Table1

затем удалите из обеих таблиц в качестве циклов процесса.

на первом проходе @Table2 будет иметь последовательный номер в первой строке, начиная с 1.

во второй раз через цикл ваша вторая таблица может иметь последовательные номера в первой колонке, начиная с 1081. Но если выбрать минимальное значение переменной

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

затем вы можете обновить @Table2, чтобы RowID начинался с 1 следующим образом:

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

надеюсь, что это помогает


Если вы удалили все строки в таблице, и вы хотите вернуть значение столбца идентификаторов.

используйте команду DBCC CHECKIDENT.

DBCC CHECKIDENT(tblPerson, RESEED, 0)

эта команда сбросит столбец идентификаторов PersonId.

еще одно замечание заключается в том, что вам может потребоваться заключить имя таблицы в одинарные кавычки или квадратные скобки, если вы ссылаетесь на полный путь или если в вашем имени таблицы есть пробелы.

DBCC CHECKIDENT ( ‘databasename.dbo.orders’,RESEED, 0)

Если вам нужно усечь переменную таблицы в каждом повороте цикла while, вы можете поместить declare @myTbl (...) оператор в цикле. Это позволит воссоздать таблицу и сбросить столбец идентификаторов на каждом витке цикла. Тем не менее, он имеет большой производительности. У меня была довольно плотная петля и объявление переменной таблицы относительно delete @myTbl был в несколько раз медленнее.

  • Дэн