有時,我們可能會遇到這樣的情況,當我們數據表的float類型精度不夠時,可能需要把它統一調整成decimal或者money,而這時你一個一個去修改可能會崩潰,因為你無法從幾千張表裡確實找到所有的float類型的欄位,而這時我們就需要自動的,批量的去處理它們。 實現思路:從系統表中查詢所有用戶建立的表 ...
有時,我們可能會遇到這樣的情況,當我們數據表的float類型精度不夠時,可能需要把它統一調整成decimal或者money,而這時你一個一個去修改可能會崩潰,因為你無法從幾千張表裡確實找到所有的float類型的欄位,而這時我們就需要自動的,批量的去處理它們。
實現思路:從系統表中查詢所有用戶建立的表,然後查詢指定類型的所有欄位,最後使用alter table alter column去更新這個欄位.
知識點
- 游標
- exec
- SYSOBJECTS表和SYSCOLUMNS表
常用類型的typeid值
xtype= 35 'text'
xtype=36 'uniqueidentifier'
xtype=48 'tinyint'
xtype=52 'smallint'
xtype=56 'int'
xtype=58 'smalldatetime'
xtype=59 'real'
xtype=60 'money'
xtype=61 'datetime'
xtype=62 'float'
xtype=98 'sql_variant'
xtype=99 'ntext'
xtype=104 'bit'
xtype=106 'decimal'
xtype=108 'numeric'
xtype=122 'smallmoney'
xtype=127 'bigint'
xtype=165 'varbinary'
xtype=167 'varchar'
xtype=173 'binary'
xtype=175 'char'
xtype=189 'timestamp'
xtype=231 'nvarchar'
xtype=239 'nchar'
xtype=241 'xml'
xtype=231 'sysname'
實現代碼
DECLARE @tableName varchar(256)
DECLARE @columnName varchar(256)
DECLARE cursor2 CURSOR
FOR
SELECT NAME FROM SYSOBJECTS WHERE TYPE='U'
OPEN cursor2
FETCH NEXT FROM cursor2 INTO @tableName
WHILE @@fetch_status = 0
BEGIN
DECLARE cursor3 CURSOR
FOR
SELECT name FROM SYSCOLUMNS WHERE ID=OBJECT_ID(@tableName) and xtype=60
OPEN cursor3
FETCH NEXT FROM cursor3 INTO @columnName
WHILE @@fetch_status = 0
BEGIN
print '更新表'+@tableName+',更新欄位'+@columnName
Exec('ALTER TABLE '+@tableName+' ALTER COLUMN '+@columnName+' [float] ')
FETCH NEXT FROM cursor3 INTO @columnName
END
CLOSE cursor3
DEALLOCATE cursor3
FETCH NEXT FROM cursor2 INTO @tableName
END
CLOSE cursor2
DEALLOCATE cursor2