Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

DBCC CHECKIDENT (yourtableName, reseed, @NewStartSeedValue)

Ответ 3

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

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

DBCC CHECKIDENT(tblPerson, RESEED, 0)

Эта команда будет содержать столбец reset PersonId.

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

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

Ответ 4

    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)[email protected]

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

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

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

Ответ 5

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

Когда вы выполняете цикл,

Insert into @Table2 from @Table1

затем Удалить из обоих таблиц в качестве технологических циклов.

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

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

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

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

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

Надеюсь, что это поможет

Ответ 6

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

  • Dan