天天看點

向SQL Server 資料庫中使用SQL Script向表添加列并指定添加列的位置

         使用SQL語句向資料表中添加列,我想大家都清楚該如何做,示例如下:

use test

go

alter table testadd

add testid int not null default(1)

但是如果想将添加的列制定到某一列後呢,該如何實作呢?

今天我在網上查找了很久,沒有很理想的實作,考慮到

SQL Server 2008有很強大腳本生成功能,于是決定

在企業管理器中給一個表手動增加一個列到指定列後,看系統是

怎麼樣生成的sql的。

操作如下:

向SQL Server 資料庫中使用SQL Script向表添加列并指定添加列的位置

下面點選生成修改的表的SQL Script,如下圖:  

向SQL Server 資料庫中使用SQL Script向表添加列并指定添加列的位置

  生成的腳本如下所示:

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

GO

ALTER TABLE dbo.testadd

 DROP CONSTRAINT DF__testadd__testid__03317E3D

GO

ALTER TABLE dbo.testadd

 DROP CONSTRAINT DF__testadd__testid2__0425A276

GO

CREATE TABLE dbo.Tmp_testadd

 (

 id int NOT NULL IDENTITY (1, 1),

 code nvarchar(20) NOT NULL,

 name nvarchar(50) NULL,

 remark nvarchar(200) NULL,

 createdate datetime NULL,

 createuserid nvarchar(30) NULL,

 testaddcolumn nvarchar(50) NULL,

 endamount money NULL,

 testid int NOT NULL,

 testid2 int NOT NULL

 )  ON [PRIMARY]

GO

ALTER TABLE dbo.Tmp_testadd SET (LOCK_ESCALATION = TABLE)

GO

ALTER TABLE dbo.Tmp_testadd ADD CONSTRAINT

 DF__testadd__testid__03317E3D DEFAULT ((1)) FOR testid

GO

ALTER TABLE dbo.Tmp_testadd ADD CONSTRAINT

 DF__testadd__testid2__0425A276 DEFAULT ((2)) FOR testid2

GO

SET IDENTITY_INSERT dbo.Tmp_testadd ON

GO

IF EXISTS(SELECT * FROM dbo.testadd)

  EXEC('INSERT INTO dbo.Tmp_testadd (id, code, name, remark, createdate, createuserid, endamount, testid, testid2)

  SELECT id, code, name, remark, createdate, createuserid, endamount, testid, testid2 FROM dbo.testadd WITH (HOLDLOCK TABLOCKX)')

GO

SET IDENTITY_INSERT dbo.Tmp_testadd OFF

GO

DROP TABLE dbo.testadd

GO

EXECUTE sp_rename N'dbo.Tmp_testadd', N'testadd', 'OBJECT'

GO

ALTER TABLE dbo.testadd ADD CONSTRAINT

 PK__testadd__357D4CF87F60ED59 PRIMARY KEY CLUSTERED

 (

 code

 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO

COMMIT

系統的方法是,先生成一個和修改後的表一樣的臨時表,将原來的表中的資料放到臨時表中,然後原來的表删除掉,

再将臨時表的名字改為原來的表的名稱就可以了。

呵呵,原來系統是使用臨時表做橋梁完成的。