Как повторно заполнить столбец идентификаторов в табличной переменной T-SQL? - PullRequest
32 голосов
/ 29 сентября 2008

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

Ответы [ 5 ]

34 голосов
/ 29 сентября 2008

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

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

33 голосов
/ 29 сентября 2008

Усечение таблицы приведет к сбросу ВСЕХ данных и сбросу начального числа идентификаторов.

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

DBCC CHECKIDENT (yourtableName, reseed, @NewStartSeedValue)
0 голосов
/ 26 января 2015

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

Когда вы проходите цикл,

Insert into @Table2 from @Table1

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

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

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

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

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

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

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

0 голосов
/ 07 июля 2014
    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» и т. Д.

0 голосов
/ 28 октября 2011

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

  • Dan
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...