有時,咱們可能會遇到這樣的狀況,當咱們數據表的float類型精度不夠時,可能須要把它統一調整成decimal或者money,而這時你一個一個去修改可能會崩潰,由於你沒法從幾千張表裏確實找到全部的float類型的字段,而這時咱們就須要自動的,批量的去處理它們。sql
實現思路:從系統表中查詢全部用戶創建的表,而後查詢指定類型的全部字段,最後使用alter table alter column去更新這個字段.ide
知識點fetch
經常使用類型的typeid值code
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'
實現代碼xml
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