SQL Server 2000如何用SQL語句在在指定位置插入列

使用alter table可以在表中插入列,插入的列都是放在最後,但有的時候需要將列插入到其他列的前面,用企業管理器可以處理,如果用SQL腳本該如何做呢?

首先參考如下代碼:
create table test (A char(10),C char(10),D char(10))
insert into test values ('Col A','Col C','Col D')
select * from test

--允許系統標更新
exec sp_configure 'allow updates','1'
go
reconfigure with override
go
--添加D列
alter table test add B int

--更新C,D列順序
update syscolumns set colid=colid+1 where colid>=2 and id = object_id('test')

--更新B列順序
update syscolumns set colid=2 where name='B' and id=object_id('test')

--禁用系統標更新
exec sp_configure 'allow updates','0'
go
reconfigure with override
go

select * from test
drop table test

   但是此腳本有一個嚴重問題,如果表中已經有數據,那麼插入列後數據會顛倒,即D列的數據沒有了(NULL),而新加的B列有雜亂數據,看來此法不行,即便是空表也難說其他地方更改不到位,所以此法不能用。

   後來在企業管理器中做了一個插入列的操作,然後“保存更改腳本”,發現系統的處理很簡單,就是建一個新表Tmp_test,把舊錶test的數據全部插入到新表中,然後刪除test,把Tmp_test改名爲test,代碼如下:

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
CREATE TABLE dbo.Tmp_test
 (
 a char(10) NULL,
 b char(10) NULL,
 c char(10) NULL,
 d char(10) NULL
 )  ON [PRIMARY]
GO
IF EXISTS(SELECT * FROM dbo.test)
  EXEC('INSERT INTO dbo.Tmp_test (a, c, d)
  SELECT a, c, d FROM dbo.test (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.test
GO
EXECUTE sp_rename N'dbo.Tmp_test', N'test', 'OBJECT'
GO
COMMIT

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章