將數據庫某種類型的字段更新為另一種類型


有時,我們可能會遇到這樣的情況,當我們數據表的float類型精度不夠時,可能需要把它統一調整成decimal或者money,而這時你一個一個去修改可能會崩潰,因為你無法從幾千張表里確實找到所有的float類型的字段,而這時我們就需要自動的,批量的去處理它們。

實現思路:從系統表中查詢所有用戶建立的表,然后查詢指定類型的所有字段,最后使用alter table alter column去更新這個字段.

知識點

  1. 游標
  2. exec
  3. 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM