Ответ 1
Вместо того, чтобы полагаться на Identity, почему бы не использовать новые функции ранжирования, такие как Row_Number
Insert @MyTableVar( Id, Value )
Select Row_Number() Over ( Order By Value )
, Value
From SomeOtherTable
Скажем, у меня есть переменная таблицы:
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 | |___________|_________________|
Вместо того, чтобы полагаться на Identity, почему бы не использовать новые функции ранжирования, такие как Row_Number
Insert @MyTableVar( Id, Value )
Select Row_Number() Over ( Order By Value )
, Value
From SomeOtherTable
Вместо повторного посева IDENTITY, почему бы просто не удалить из переменной @table, используйте ROW_NUMBER() для ввода? например вместо ленивых
SELECT * FROM @MyTableVar;
... использование...
SELECT ID = ROW_NUMBER() OVER (ORDER BY ID), SomeData FROM @MyTableVar;
Теперь вам не нужно заботиться о том, что такое семя, начинается ли оно с 1, есть ли пробелы и т.д.
К сожалению, нет функции для повторного заполнения столбца идентификации в переменной таблицы, я знаю, что этот вопрос очень старый, но в случае, если другие люди столкнулись с одной и той же проблемой, я хотел бы поделиться своим методом для решения этой проблемы.
/* 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
Однако, если вы хотите выполнить динамическое повторение внутри цикла, я бы предложил использовать объект таблицы
Вы не можете повторно установить значение идентификатора в переменной таблицы, но вы можете сделать то же самое с таблицей 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
Поскольку вы повторно используете свою таблицу, если я правильно понял, как насчет того, чтобы вы не инициализировали ваши счетчики до 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, и вам не нужно обрезать таблицу.
Можно ли использовать временную таблицу? Это пример того, как это сделать с помощью таблицы 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
Привет
Петр
вы должны 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.
Возможно ли иметь другой столбец 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
DELETE FROM не имеет идентификатора reset. TRUNCATE делает.
Я попробовал это в сети, но я не могу получить какое-либо решение для идентификатора 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
У меня была эта идея, и она работает!!!
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
Если вы используете 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