已表 tableA(id int not null,name varhcar(10))为例 BEGIN TRANSACTION GO CREATE TABLE dbo.Tmp_tableA ( id int NOT NULL IDENTITY (1, 1), name varchar(10) ) ON [PRIMARY] GO SET IDENTITY_INSERT dbo.Tmp_tableA ON GO IF EXISTS(SELECT * FROM dbo.tableA) EXEC('INSERT INTO dbo.Tmp_tableA (id,name) SELECT id,name FROM dbo.tableA WITH (HOLDLOCK TABLOCKX)') GO SET IDENTITY_INSERT dbo.Tmp_tableA OFF GO DROP TABLE dbo.tableA GO EXECUTE sp_rename N'dbo.Tmp_tableA', N'tableA', 'OBJECT' GO ALTER TABLE dbo.tableA ADD CONSTRAINT PK_tableA PRIMARY KEY CLUSTERED ( id ) ON [PRIMARY]GO COMMIT
LS的只能更改一个表 我希望可以更改所有的表,因为表太多了。 每个表的主键命名都是ID
SQL Server 2005是否可以更改系统表,我写了一个SQL,不过不能执行update a set a.is_identity=1 from sys.columns a,sys.objects b where a.name='ID' and a.object_id=b.object_id and b.type='U'设置了EXEC sp_configure 'allow updates', 1 RECONFIGURE WITH OVERRIDE;也不行,SQL 2000中可以
declare @sql varchar(8000) set @sql=' declare @sql varchar(8000) set @sql=''alter table ? drop column id ; alter table ? add id int identity(1,1) primary key'' exec(@sql) ' exec sp_msforeachtable @sql 没数据,试试
DECLARE @s VARCHAR(1000) DECLARE c CURSOR FOR SELECT 'ALTER TABLE ['+a.name+'] DROP COLUMN ID;ALTER TABLE ['+a.name+'] ADD ID INT IDENTITY PRIMARY KEY;' FROM sysobjects a JOIN syscolumns b ON a.id=b.id WHERE b.name='id' AND a.type='U' OPEN c FETCH c INTO @s WHILE @@FETCH_STATUS=0 BEGIN EXEC (@s) FETCH c INTO @s END CLOSE c DEALLOCATE c
楼主,一下是你要的sql,测试通过, CREATE TABLE #TableNameList (name varchar(100)) INSERT INTO #TableNameList SELECT o.name FROM sys.objects AS o JOIN sys.columns AS c ON o.object_id=c.object_id WHERE o.[type]='U' AND c.name='id' WHILE (SELECT COUNT(*) FROM #TableNameList)>0 BEGIN DECLARE @tableName varchar(100) SELECT TOP 1 @tableName=name FROM #TableNameList DECLARE @dropColumnSql nvarchar(100) DECLARE @addNewColumnSql nvarchar(100) SET @dropColumnSql = 'ALTER TABLE ' + @tableName + ' DROP COLUMN id' SET @addNewColumnSql='ALTER TABLE ' + @tableName + ' ADD id INT IDENTITY(1,1)' exec sp_executesql @dropColumnSql exec sp_executesql @addNewColumnSql DELETE FROM #TableNameList WHERE name=@tableName END DROP TABLE #TableNameList
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_tableA
(
id int NOT NULL IDENTITY (1, 1),
name varchar(10)
) ON [PRIMARY]
GO
SET IDENTITY_INSERT dbo.Tmp_tableA ON
GO
IF EXISTS(SELECT * FROM dbo.tableA)
EXEC('INSERT INTO dbo.Tmp_tableA (id,name)
SELECT id,name FROM dbo.tableA WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_tableA OFF
GO
DROP TABLE dbo.tableA
GO
EXECUTE sp_rename N'dbo.Tmp_tableA', N'tableA', 'OBJECT'
GO
ALTER TABLE dbo.tableA ADD CONSTRAINT
PK_tableA PRIMARY KEY CLUSTERED
(
id
) ON [PRIMARY]GO
COMMIT
LS的只能更改一个表
我希望可以更改所有的表,因为表太多了。
每个表的主键命名都是ID
from sys.columns a,sys.objects b
where a.name='ID'
and a.object_id=b.object_id
and b.type='U'设置了EXEC sp_configure 'allow updates', 1
RECONFIGURE WITH OVERRIDE;也不行,SQL 2000中可以
set @sql='
declare @sql varchar(8000)
set @sql=''alter table ? drop column id ; alter table ? add id int identity(1,1) primary key''
exec(@sql)
'
exec sp_msforeachtable @sql
没数据,试试
DECLARE c CURSOR FOR
SELECT 'ALTER TABLE ['+a.name+'] DROP COLUMN ID;ALTER TABLE ['+a.name+'] ADD ID INT IDENTITY PRIMARY KEY;'
FROM sysobjects a
JOIN syscolumns b
ON a.id=b.id
WHERE b.name='id'
AND a.type='U'
OPEN c
FETCH c INTO @s
WHILE @@FETCH_STATUS=0
BEGIN
EXEC (@s)
FETCH c INTO @s
END
CLOSE c
DEALLOCATE c
用企业管理器该一下吧
CREATE TABLE #TableNameList
(name varchar(100))
INSERT INTO #TableNameList
SELECT o.name FROM sys.objects AS o JOIN sys.columns AS c ON o.object_id=c.object_id WHERE o.[type]='U' AND c.name='id'
WHILE (SELECT COUNT(*) FROM #TableNameList)>0
BEGIN
DECLARE @tableName varchar(100)
SELECT TOP 1 @tableName=name FROM #TableNameList
DECLARE @dropColumnSql nvarchar(100)
DECLARE @addNewColumnSql nvarchar(100)
SET @dropColumnSql = 'ALTER TABLE ' + @tableName + ' DROP COLUMN id'
SET @addNewColumnSql='ALTER TABLE ' + @tableName + ' ADD id INT IDENTITY(1,1)'
exec sp_executesql @dropColumnSql
exec sp_executesql @addNewColumnSql
DELETE FROM #TableNameList WHERE name=@tableName
END
DROP TABLE #TableNameList
要用t-sql,太复杂.