Есть ли способ сбросить идентичность табличной переменной? - PullRequest
13 голосов
/ 24 июня 2011

Скажем, у меня есть переменная таблицы:

DECLARE @MyTableVar TABLE (ID INT IDENTITY(1,1), SomeData NVARCHAR(300))

После того, как я вставил 250 строк, мне нужно "Начать заново" с таблицей.Я делаю это:

DELETE FROM @MyTableVar

Могу ли я что-нибудь сделать с табличной переменной, чтобы это:

insert into @MyTableVar Values("TestData")
select * from @MyTableVar

вернуло это:

_______________________________
|    ID     |    SomeData     |
|___________|_________________|
|           |                 |   
|     1     |    TestData     |        
|___________|_________________|

из этого:

_______________________________
|    ID     |    SomeData     |
|___________|_________________|
|           |                 |   
|    251    |    TestData     |        
|___________|_________________|

Ответы [ 12 ]

13 голосов
/ 24 июня 2011

Вместо того, чтобы полагаться на личность, почему бы не использовать новые функции ранжирования, такие как Row_Number

Insert @MyTableVar( Id, Value )
Select Row_Number() Over ( Order By Value )
    , Value
From SomeOtherTable
4 голосов
/ 24 июня 2011

Вместо повторного заполнения IDENTITY, почему бы просто не удалить из переменной @table, а затем использовать ROW_NUMBER () для ввода? например вместо ленивых

SELECT * FROM @MyTableVar;

... использовать ...

SELECT ID = ROW_NUMBER() OVER (ORDER BY ID), SomeData FROM @MyTableVar;

Теперь вам не нужно заботиться о том, что такое семя, начинается ли оно с 1, есть ли пробелы и т. Д.

3 голосов
/ 13 мая 2015

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

/* declare another table variable with same structure and perform select insert*/

DECLARE @MyTableVar1 TABLE (ID INT IDENTITY(1,1), SomeData NVARCHAR(300))
insert into @MyTableVar1
select someData from @MyTableVar

Однако, если вы хотите выполнить динамическое повторное заполнение внутри цикла, я бы предложил использовать табличный объект

1 голос
/ 05 августа 2015

Поскольку вы повторно используете свою таблицу, если я правильно понял, как насчет того, чтобы вы не инициализировали свои счетчики равными 1, а вместо этого использовали это в качестве примера?не перезагружая цикл до 1, при этом вам не нужно обрезать таблицу.

1 голос
/ 16 сентября 2013

Вы не можете повторно заполнить значение идентификатора в табличной переменной, но вы можете сделать то же самое с временной таблицей:

CREATE  TABLE #TAB(ID INT IDENTITY,VALUE VARCHAR(10))
DECLARE @RESEED INT = 32
DBCC CHECKIDENT(#TAB,RESEED,@RESEED)
INSERT INTO #TAB  
SELECT 'TEST'
SELECT * FROM #TAB  
0 голосов
/ 20 октября 2016

У меня только что была эта идея, и она работает !!!:

declare @TableVariable table (
    IdentityColumn int identity(1,1),
    SomeOtherValue int,
    DesiredResult int
)
declare @FirstIdentityValueEachTimeYouLoadDataToTable int
declare @Count int
set @Count = 1

while @Count <= 5
begin
    delete @TableVariable

    insert into @TableVariable (SomeOtherValue) select 45
    insert into @TableVariable (SomeOtherValue) select 90
    insert into @TableVariable (SomeOtherValue) select 2

    select @FirstIdentityValueEachTimeYouLoadDataToTable = min(IdentityColumn) from @TableVariable

    Update @TableVariable set DesiredResult = IdentityColumn - @FirstIdentityValueEachTimeYouLoadDataToTable + 1

    select * from @TableVariable
    set @Count = @Count + 1
end 
0 голосов
/ 07 декабря 2012

Если вы используете SQL Server, используйте DBCC CHECKIDENT('Customer', RESEED, 0), где Customer - это имя таблицы.Когда вы вставляете записи в таблицу после этой команды, значение столбца первичного ключа снова будет начинаться с 1.

Читать это http://codedotnets.blogspot.in/2012/09/how-to-reset-identity-in-sql-server.html

0 голосов
/ 30 августа 2012

Я пробовал это в сети, но я не могу найти какое-либо решение для сброса идентификатора для табличной переменной.

Если вы можете использовать временную таблицу #MyTableVar вместо табличной переменной @MyTableVar, тогда можно сбросить значение идентификатора

   DBCC CHECKIDENT('TableName', RESEED, NewValue)

   DBCC CHECKIDENT(#MyTableVar, RESEED, 0)

Новое значение должно быть на единицу меньше, чем newIdentiyValue

   NewValue= NewIdentity-1;

Если вы все еще хотите узнать больше, вы можете сослаться на мой блог http://tryconcepts.blogspot.in/2012/08/reset-identity-column-to-new-id.html

0 голосов
/ 26 июня 2011

DELETE FROM не сбрасывает личность. TRUNCATE делает.

0 голосов
/ 25 июня 2011

Возможно ли иметь другой столбец int в вашей табличной переменной и обновить этот столбец по модулю после завершения вставки?

declare @Mytablevar table
(
id int identity(1,1)
,id1 int
somedata nvarchar(300)
)

-- insert your data as you would.  After insert is finished, do the following:

update @mytablevar set id1 = case when id > 250 then id % 250 else id end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...