批量修改相同結構的table layout
最近公司的財務系統要和總部的財務系統版本同步,由於公司的財務系統有十幾年沒有和總部的財務系統進行版本同步了,趁這次OS升級的機會進行同步,公司將table layout的同步交給我處理,由於公司的財務系統備份了很多表,而這些表的結構都一樣,命名也有一定的規則,比如表ss01,後面的備份的表就是ss0101,ss0102...。
經過和總部的table layou相比之後發現,所有的table layout字段結構都沒有改變,這讓我很吃驚,也很佩服,說明當初設計table layou的人設計table的多么的完美,十幾年之後僅僅變化了一些字段的精度,比如:decimal(14,3),改為decimal(18,3),或者是默認值有些改變,所以我只需要修改精度和默認值就OK了。
但是每個表都有幾十個相同結構的表啊,怎么辦?難道要我一個一個的修改表結構,這樣要做到猴年馬月啊!(PS:公司的財務系統總共有1000多個表),後來想了個偷懶的辦法:用遊標生成命令:直接print出來,然後執行print的語句,呵呵!如何儘快的比對公司和總部的兩table的layout呢?我將表的design試圖中的結構複製出來,貼到EXCEL中,字段名稱、類型、長度,一目了然,只需再加一個默認值,默認值就要自己到design視圖中去找一下了,至於是要修改精度呢,還是要修改默認值,按需索取,呵呵!
語句如下:
代码
1
2
3 select name from sysobjects where type='U' AND NAME LIKE 'ss82%' order by name
4
5 -----
6 DECLARE @dbName NVARCHAR(128)
7 DECLARE @qSql NVARCHAR(4000)
8 DECLARE dbList CURSOR Local FOR --建立遊標
9 select name from sysobjects where type='U' AND NAME LIKE 'ss82%' order by name
10 for Read Only --禁止通過遊標更新
11 OPEN dbList
12 FETCH Next FROM dbList INTO @dbName
13 While (@@FETCH_STATUS <> -1)
14 BEGIN
15 set @qSql=''
16 --修改默認值
17 set @qSql='alter table '+@dbName+' drop constraint df_'+@dbName+'_amtd '
18 SET @qSql=@qSql+'alter table '+@dbName+' add constraint df_'+@dbName+'_amtd'+' default (0) for amtd'
19 --修改表結構
20 --set @qSql=@qSql+' aLTER table '+@dbName+' aLTER cOLUMN amt2 decimal(18,3) '
21 --set @qSql=@qSql+' aLTER table '+@dbName+' aLTER cOLUMN qty decimal(18,3) '
22 --set @qSql=@qSql+' aLTER table '+@dbName+' aLTER cOLUMN amt1 decimal(18,3) '
23 --set @qSql=@qSql+' aLTER table '+@dbName+' aLTER cOLUMN amt0 decimal(18, 3) '
24 --set @qSql=@qSql+' aLTER table '+@dbName+' aLTER cOLUMN upri decimal(13, 6) '
25 PRINT @qSql
26
27 FETCH NEXT FROM dbList INTO @dbName
28 END
29 close dbList
30 deallocate dbList
31
32 --删除默认值
33 select * from sysobjects where object_name(parent_obj)='SS83KM'
34 --执行结果也可以得到表的默认值信息
35 --------------------------------------------------------------------
36 -- 确定默认值名称后,就可用
37 alter table [表名] drop constraint [默认值名]
38
39 /***************************************************************************************/
40 --alter table LOGSS83SF drop constraint DF_LOGSS83SF_LOGDT
41 ---
42
43 select * from sysobjects where object_name(parent_obj)='SS821F'
44 alter table LOGSS83SF drop constraint DF_LOGSS83SF_LOGDT
45
46
47
2
3 select name from sysobjects where type='U' AND NAME LIKE 'ss82%' order by name
4
5 -----
6 DECLARE @dbName NVARCHAR(128)
7 DECLARE @qSql NVARCHAR(4000)
8 DECLARE dbList CURSOR Local FOR --建立遊標
9 select name from sysobjects where type='U' AND NAME LIKE 'ss82%' order by name
10 for Read Only --禁止通過遊標更新
11 OPEN dbList
12 FETCH Next FROM dbList INTO @dbName
13 While (@@FETCH_STATUS <> -1)
14 BEGIN
15 set @qSql=''
16 --修改默認值
17 set @qSql='alter table '+@dbName+' drop constraint df_'+@dbName+'_amtd '
18 SET @qSql=@qSql+'alter table '+@dbName+' add constraint df_'+@dbName+'_amtd'+' default (0) for amtd'
19 --修改表結構
20 --set @qSql=@qSql+' aLTER table '+@dbName+' aLTER cOLUMN amt2 decimal(18,3) '
21 --set @qSql=@qSql+' aLTER table '+@dbName+' aLTER cOLUMN qty decimal(18,3) '
22 --set @qSql=@qSql+' aLTER table '+@dbName+' aLTER cOLUMN amt1 decimal(18,3) '
23 --set @qSql=@qSql+' aLTER table '+@dbName+' aLTER cOLUMN amt0 decimal(18, 3) '
24 --set @qSql=@qSql+' aLTER table '+@dbName+' aLTER cOLUMN upri decimal(13, 6) '
25 PRINT @qSql
26
27 FETCH NEXT FROM dbList INTO @dbName
28 END
29 close dbList
30 deallocate dbList
31
32 --删除默认值
33 select * from sysobjects where object_name(parent_obj)='SS83KM'
34 --执行结果也可以得到表的默认值信息
35 --------------------------------------------------------------------
36 -- 确定默认值名称后,就可用
37 alter table [表名] drop constraint [默认值名]
38
39 /***************************************************************************************/
40 --alter table LOGSS83SF drop constraint DF_LOGSS83SF_LOGDT
41 ---
42
43 select * from sysobjects where object_name(parent_obj)='SS821F'
44 alter table LOGSS83SF drop constraint DF_LOGSS83SF_LOGDT
45
46
47