说我有一个表变量:
DECLARE @MyTableVar TABLE (ID INT IDENTITY(1,1), SomeData NVARCHAR(300))
插入250行后,我需要使用表格“重新开始”。我这样做:
DELETE FROM @MyTableVar
我能对table变量做些什么,以便:
insert into @MyTableVar Values("TestData")
select * from @MyTableVar
将返回此信息:
_______________________________ | ID | SomeData | |___________|_________________| | | | | 1 | TestData | |___________|_________________|
而不是:
_______________________________ | ID | SomeData | |___________|_________________| | | | | 251 | TestData | |___________|_________________|
答案 0 :(得分:13)
相反,依赖于身份,为什么不使用新的排名功能,如Row_Number
Insert @MyTableVar( Id, Value )
Select Row_Number() Over ( Order By Value )
, Value
From SomeOtherTable
答案 1 :(得分:4)
为什么不从@table变量中删除,而不是重新播种IDENTITY,然后对输入使用ROW_NUMBER()?例如而不是懒惰的
SELECT * FROM @MyTableVar;
... ...使用
SELECT ID = ROW_NUMBER() OVER (ORDER BY ID), SomeData FROM @MyTableVar;
现在你不需要关心种子是什么,是否从1开始,是否有空隙等。
答案 2 :(得分: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
但是,如果要在循环内执行动态重新播种,我建议使用表格对象
答案 3 :(得分:1)
您无法在表变量上重新设置标识值,但您可以使用临时表执行相同的操作:
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
答案 4 :(得分:1)
由于你正在重复使用你的表,如果我把它弄好了,你怎么不把你的计数器初始化为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,也不需要截断表。
答案 5 :(得分:0)
你能用临时表吗? 这是一个如何使用临时表执行此操作的示例。
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
此致
·彼得
答案 6 :(得分:0)
你应该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的syntac是:
TRUNCATE TABLE
[ { database_name .[ schema_name ] . | schema_name . } ]
table_name
[ ; ]
编辑:我没有注意到你在质疑表变量。
据我所知,没有办法重置表变量中的标识列。你可以使用临时表。
答案 7 :(得分:0)
是否可以在表变量上有另一个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
答案 8 :(得分:0)
DELETE FROM不会重置身份。 TRUNCATE。
答案 9 :(得分:0)
我在网上尝试过,但我无法获得表变量重置标识的任何解决方案。
如果您能够使用临时表#MyTableVar而不是表@MyTableVar变量,则可以重置标识值
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
答案 10 :(得分:0)
我刚才有这个想法,它的确有效! :
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
答案 11 :(得分:-1)
如果您使用的是SQL Server,请使用此DBCC CHECKIDENT('Customer', RESEED, 0)
其中Customer是表名。在此命令之后将记录插入表中时,您的质量键列值将再次从1开始。
阅读本文 http://codedotnets.blogspot.in/2012/09/how-to-reset-identity-in-sql-server.html