數據庫 SQL Server 修改 表結構 腳本 sql語句

在使用一些表管理工具,或對數據庫的物理表結構進行改動時,可以通過數據庫的語法腳本實現。

1.創建表

CREATE TABLE dbo.表名
	(
	 列名1 [列名數據類型](數據長度) 是否爲Null,
     列名2 [列名數據類型](數據長度) 是否爲Null(Null/Not Null),
	)  ON [PRIMARY]
ALTER TABLE dbo.表名 ADD CONSTRAINT
	PK_表名 PRIMARY KEY CLUSTERED 
	(
	 主鍵列名  --若是聯合主鍵 則爲 列名1,列名2
	) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
    ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

示例:

創建一個表名爲 Table_1的 表,指定mainkey列爲自增主鍵 且從10000 開始,步長爲1遞增

CREATE TABLE dbo.Table_1
	(
	mainkey int NOT NULL IDENTITY (10000, 1),
	a char(1) NULL,
	b nvarchar(50) NULL,
	c ntext NULL
	)  ON [PRIMARY]
	 TEXTIMAGE_ON [PRIMARY]
	ALTER TABLE dbo.Table_1 ADD CONSTRAINT
	PK_Table_1 PRIMARY KEY CLUSTERED 
	(
	mainkey 
	) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

2.設置表結構裏列字段說明

爲表的某一列 添加說明 

EXECUTE sp_addextendedproperty N'MS_Description', N'列的說明信息', N'SCHEMA', N'dbo', N'TABLE', N'表名', N'COLUMN', N'列名'

注意:添加說明sp_addextendedproperty 更新說明sp_updateextendedproperty 刪除說明是 sp_dropextendedproperty

示例:

爲剛纔的Table_1表 的 b列 添加 ‘b列說明’ ,以及 c列 添加 ‘c列說明’

EXECUTE sp_addextendedproperty N'MS_Description', N'b列的說明', N'SCHEMA', N'dbo', N'TABLE', N'Table_1', N'COLUMN', N'b'
EXECUTE sp_addextendedproperty N'MS_Description', N'c列的說明', N'SCHEMA', N'dbo', N'TABLE', N'Table_1', N'COLUMN', N'c'

想確保不報異常,可以採用如下方式 進行設置 列字段說明

IF EXISTS (SELECT 1 FROM ::fn_listextendedproperty (NULL, 'user', 'dbo', 'table', '表名', 'column',default) where objname='列名')
EXECUTE sp_updateextendedproperty N'MS_Description', N'列的說明', N'SCHEMA', N'dbo', N'TABLE', N'表名', N'COLUMN', N'列名'
ELSE
EXECUTE sp_addextendedproperty N'MS_Description', N'列的說明', N'SCHEMA', N'dbo', N'TABLE', N'表名', N'COLUMN', N'列名'

 

3.設置表的列字段的 默認值

IF EXISTS (select * from sysobjects where name='DF_表名_列名')
ALTER TABLE dbo.表名 DROP CONSTRAINT DF_表名_列名
ALTER TABLE dbo.表名 ADD CONSTRAINT DF_表名_列名 DEFAULT N'默認值' FOR 列名

這裏是先採用 drop 將列名的約束值信息丟掉,然後再添加進去,確保不報異常

若是想要讀取某個表的默認值 就用

select TM.name, text defaultValue 
from sysobjects TM
left join syscomments TB
on TM.id = TB.id
where name like '%表名%'
and xtype = 'D' --xtype D標識默認值  PK 標識是 主鍵

4.添加一列

ALTER TABLE dbo.表名 ADD 列名 數據類型(長度) 是否爲NULL

示例:Table_1里加了個 d列

ALTER TABLE dbo.Table_1 ADD d nchar(10) NULL

5.更改列名

EXECUTE sp_rename N'dbo.表名.舊列名', N'Tmp_新列名', 'COLUMN' 
EXECUTE sp_rename N'dbo.表名.Tmp_新列名', N'新列名', 'COLUMN' 

示例:將 Table_1 的 b列 更名爲 newB

EXECUTE sp_rename N'dbo.Table_1.b', N'Tmp_newB', 'COLUMN' 
EXECUTE sp_rename N'dbo.Table_1.Tmp_newB', N'newB', 'COLUMN' 

6.刪除列

先去刪除約束 再去刪除列,描述字段 刪除列時 自動刪除了

IF EXISTS (select 1 from sysobjects where name='DF_表名_列名')
ALTER TABLE dbo.表名 DROP CONSTRAINT DF_表名_列名
ALTER TABLE dbo.表名 DROP COLUMN 列名

7.更改表結構

例如 :變更字段的數據類型、變更字段的 是否爲Null, 變更表結構的主鍵構成,這些都屬於變更表結構,此時需要先建一張臨時表,把數據全部拷走,再重新建表把數據拷貝回來,並把數據改爲對應的。

主要先創建一個 Tmp_表名 的臨時表,然後 通過 CONVERT 函數 進行數據轉換 CONVERT(新列對應的數據類型(長度), 舊列名)

然後通過 sp_rename Tmp_表名 更名爲 原本的表名。

利用事件回滾機制 防止出現錯誤
 

BEGIN TRANSACTION 

執行體

COMMIT

注意:這裏的主鍵聲明 要放到 表重命名後,用 更名後的表建立約束。 

BEGIN TRANSACTION
CREATE TABLE dbo.Tmp_表名
	(
	表列配置項
	)  ON [PRIMARY]
IF EXISTS(SELECT * FROM dbo.表名)
	 EXEC('INSERT INTO dbo.Tmp_表名 (新列名1, 新列名2, 新列名3)
		SELECT 舊列名1, CONVERT(新列名2的數據類型, 舊列名2), 舊列名3 FROM dbo.表名 WITH (HOLDLOCK TABLOCKX)')
DROP TABLE dbo.表名
EXECUTE sp_rename N'dbo.Tmp_表名', N'表名', 'OBJECT' 
ALTER TABLE dbo.表名 ADD CONSTRAINT
	PK_表名 PRIMARY KEY CLUSTERED 
	(
	主鍵列
	) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
COMMIT

示例:

將Table_1的

b列 更新列名爲 newB  並更新數據類型爲 ntext → nvarchar(100)

c列 僅更新列名 c newCName

BEGIN TRANSACTION
CREATE TABLE dbo.Tmp_Table_1
	(
	mainkey int NOT NULL IDENTITY (1, 1),
	newB nvarchar(100) NULL,
	newCName nchar(10) NULL
	)  ON [PRIMARY]
IF EXISTS(SELECT * FROM dbo.Table_1)
	 EXEC('INSERT INTO dbo.Tmp_Table_1 (mainkey , newB, newCName )
		SELECT mainkey , CONVERT(nvarchar(100), b), c FROM dbo.Table_1 WITH (HOLDLOCK TABLOCKX)')
DROP TABLE dbo.Table_1
EXECUTE sp_rename N'dbo.Tmp_Table_1', N'Table_1', 'OBJECT' 
ALTER TABLE dbo.Table_1 ADD CONSTRAINT
	PK_Table_1 PRIMARY KEY CLUSTERED 
	(
	mainkey 
	) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
COMMIT

ps:若表結構裏還有默認值,列說明,相關語句請參照各對應SQL添加到 Commit之前即可

8.其他

對於sql server 的其他語句,可以通過 生成腳本來查看

 

附:

sql語句讀取一個表的相關配置項

SELECT  
        a.colorder as colOrder, 
        d.name as tableName,
        a.name as FieldName, 
        convert(int,case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then 1 else 0 end) as isIndex, 
        convert(int,case when exists(SELECT 1 FROM sysobjects where xtype='PK' and parent_obj=a.id and name in ( 
                                         SELECT name FROM sysindexes WHERE indid in( SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid))) then 1 else 0 end) as isPk, 
        b.name as sqlTypeName, 
        a.length as 'length', 
        convert(int,COLUMNPROPERTY(a.id,a.name,'PRECISION')) as 'size', 
        convert(int,isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0)) as 'scale', 
        convert(int,case when a.isnullable=1 then 1 else 0 end) as 'Nullable', 
        convert(varchar(100), isnull(e.text,'')) as defaultVal, 
        convert(varchar(255), isnull(g.[value],'')) as remarks 
 FROM  
        syscolumns a 
 left join  
        systypes b  
 on  
        a.xusertype=b.xusertype 
 inner join  
        sysobjects d  
 on  
        a.id=d.id  and d.xtype='U' and  d.name<>'dtproperties' 
 left join  
        syscomments e  
 on  
        a.cdefault=e.id 
 left join  
 sys.extended_properties   g  
 on  
        a.id=G.major_id and a.colid=g.minor_id   
 left join 
 sys.extended_properties f 
 on  
        d.id=f.major_id and f.minor_id=0 
 where  d.name='表名'
order by  
        a.id,a.colorder

 

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