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