如何让表中已有记录的标识列从1开始往下排,并将标识列的下一个值设为记录数加1

aikill 2005-09-27 10:53:06
如题
...全文
262 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
云中客 2005-09-27
  • 打赏
  • 举报
回复
create table T(id int identity(1,1),name varchar(20),desc varchar(20))
在建表设置
子陌红尘 2005-09-27
  • 打赏
  • 举报
回复
CREATE PROCEDURE SP_RESEED(@TNAME NVARCHAR(100))
AS
BEGIN
DECLARE @s NVARCHAR(4000),@v NVARCHAR(8000),@cName NVARCHAR(100)

CREATE TABLE #T1(NAME VARCHAR(100))

--去自增字段名
SET @s = N'SELECT @cName = NAME FROM SYSOBJECTS WHERE ID=OBJECT_ID('''+@TNAME+N''') AND AUTOVAL IS NOT NULL'
EXEC SP_EXECUTESQL @s,N'@cName NVARCHAR(100) OUT',@cName OUT

--取其他字段名
SET @s = 'INSERT INTO #T1 SELECT NAME FROM SYSOBJECTS WHERE ID=OBJECT_ID('''+@TNAME+''') AND AUTOVAL IS NULL'
EXEC(@s)

SET @v = ''
SELECT @v = @v + ',' + NAME FROM #T1
SET @v = STUFF(@v,1,1,'')

SET @s = 'SELECT * INTO #T from '+@TNAME+' ORDER BY '+@cName
SET @s = @s + ' TRUNCATE TABLE '+@TNAME
SET @s = @s + ' DBCC CHECKIDENT ('''+@TNAME+''', RESEED, 1)'
SET @s = @s + ' INSERT INTO '+@TNAME+'('+@v+') SELECT '+@v+' FROM #T ORDER BY '+@cName

EXEC(@s)
END
vivianfdlpw 2005-09-27
  • 打赏
  • 举报
回复
排版乱了,看这个

exec sp_msforeachtable
@command1='if exists(select 1 from syscolumns
where id=object_id(''?'')
and autoval is not null)
begin
declare @name varchar(20)
select @name=name from syscolumns
where id=object_id(''?'') and autoval is not null
exec(''alter table ? drop column ''+@name)
exec(''alter table ? add ''+@name+'' int identity(1,1)'')
end
'
vivianfdlpw 2005-09-27
  • 打赏
  • 举报
回复
exec sp_msforeachtable @command1='if exists(select 1 from syscolumns
where id=object_id(''?'')
and autoval is not null)
begin
declare @name varchar(20)
select @name=name from syscolumns
where id=object_id(''?'') and autoval is not null
exec(''alter table ? drop column ''+@name)
exec(''alter table ? add ID int identity(1,1)'')
end
'
aikill 2005-09-27
  • 打赏
  • 举报
回复
不能把上面的方法编成存储过程批处理吗?
子陌红尘 2005-09-27
  • 打赏
  • 举报
回复
通过脚本删除这些表的标识,然后重建标识列,不过会导致字段在数据库中存储的顺序发生变化。
aikill 2005-09-27
  • 打赏
  • 举报
回复
libin_ftsafe(子陌红尘) 兄的办法倒是可行,但是如果有很多这样的表需要处理呢?
有没有什么办法批处理?
子陌红尘 2005-09-27
  • 打赏
  • 举报
回复
假定表结构如下:
------------------------------------------------------------------------
create table T(id int identity(1,1),name varchar(20),desc varchar(20))
GO

--将数据倒入临时表
select * into #T from T order by id


--清空源表
truncate table T
GO

--重置标识列
DBCC CHECKIDENT (T, RESEED, 1)
GO

--将数据导回源表
insert into T(name,desc) select name,desc from #T order by id

--删除临时表
drop table #T
go
klan 2005-09-27
  • 打赏
  • 举报
回复
增加一个自增列,IDENTITY(1,1)

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧