无论如何重置表变量的身份?

时间:2011-06-24 17:02:00

标签: sql-server tsql sql-server-2008

说我有一个表变量:

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

12 个答案:

答案 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