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

Есть ли в reset идентификатор переменной таблицы?

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

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     |        
|___________|_________________|
4b9b3361

Ответ 1

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

Insert @MyTableVar( Id, Value )
Select Row_Number() Over ( Order By Value )
    , Value
From SomeOtherTable

Ответ 2

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

SELECT * FROM @MyTableVar;

... использование...

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

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

Ответ 3

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

/* 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

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

Ответ 4

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

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  

Ответ 5

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

DECLARE @ctr INT
IF @ctr IS NULL or @ctr <= 0 --this part is to control @ctr value on loops
   SET @ctr = 1
ELSE
   SELECT @ctr = MIN(id) FROM @tbl

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

Ответ 6

Можно ли использовать временную таблицу? Это пример того, как это сделать с помощью таблицы temp.

CREATE TABLE #MyTableVar (ID INT IDENTITY(1,1), SomeData NVARCHAR(300))

insert #MyTableVar(SomeData) values ('test1'), ('test2')

---doesn't work
DELETE FROM #MyTableVar 

insert #MyTableVar(SomeData) values ('test3'), ('test4')
select * from #MyTableVar 

--resets the identity
truncate table #MyTableVar
insert #MyTableVar(SomeData) values ('test3'), ('test4')
select * from #MyTableVar 

Привет

Петр

Ответ 7

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

но обратите внимание, что truncate не будет работать для некоторых таблиц (перечисленных в MSDN):

You cannot use TRUNCATE TABLE on tables that:

Are referenced by a FOREIGN KEY constraint. (You can truncate a table that has a foreign key that references itself.)

Participate in an indexed view.

Are published by using transactional replication or merge replication.

и добавил себя:

You cannot truncate a table variable.

Синтаксис truncate:

TRUNCATE TABLE 
    [ { database_name .[ schema_name ] . | schema_name . } ]
    table_name
[ ; ]

EDIT: я не заметил, что вы задаете вопрос о переменных таблицы.

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

Ответ 8

Возможно ли иметь другой столбец 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

Ответ 9

DELETE FROM не имеет идентификатора reset. TRUNCATE делает.

Ответ 10

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

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

   DBCC CHECKIDENT('TableName', RESEED, NewValue)

   DBCC CHECKIDENT(#MyTableVar, RESEED, 0)

Значение Newvalue должно быть на один меньше, чем newIdentiyValue

   NewValue= NewIdentity-1;

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

Ответ 11

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

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 

Ответ 12

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

Прочтите это http://codedotnets.blogspot.in/2012/09/how-to-reset-identity-in-sql-server.html