數據庫在設計的時候也許考慮不全面,導致某些字段類型不太准確。比如設計的時候是varchar(1024),但是實際使用的時候卻發現太小了,裝不下,於是需要修改字段類型為ntext什么的。
我最近就遇到了一個需求,需要修改20個字段的類型,把相同的腳本寫20遍嗎?NO,NO,NO!
========================================================================
我有這么一張表“Attribute”,里面有60個字段,分別是Attribute01、Attribute02、Attribute03、…… Attribute60。現在我需要把Attribute41到Attribute60的字段類型修改為ntext。
SQL Server:
DECLARE @i int SET @i=41 DECLARE @fieldName varchar(32) DECLARE @sqlStatement varchar(MAX) WHILE @i<=60 BEGIN SET @fieldName = 'Attribute' + cast(@i as varchar) SET @sqlStatement ='ALTER TABLE [Attribute] ALTER COLUMN ['+@fieldName+'] [ntext] NULL' EXEC (@sqlStatement) SET @i=@i+1 END
Oracle:
DECLARE i NUMBER; fieldName VARCHAR2(32); fieldNameBK VARCHAR2(32); sqlStatement VARCHAR2(1024); BEGIN i:=41; LOOP fieldName:='Attribute' || TO_CHAR(i); fieldNameBK:='Attribute' || TO_CHAR(i) || '_bak'; --處理CLIPEX表 sqlStatement:='Alter table Attribute ADD (' || fieldNameBK || ' NCLOB null)'; EXECUTE IMMEDIATE sqlStatement; sqlStatement:='Update Attribute set ' || fieldNameBK || ' = ' || fieldName; EXECUTE IMMEDIATE sqlStatement; sqlStatement:='alter table Attribute drop COLUMN ' || fieldName; EXECUTE IMMEDIATE sqlStatement; sqlStatement:='alter table Attribute rename COLUMN ' || fieldNameBK || ' to ' || fieldName; EXECUTE IMMEDIATE sqlStatement; i:=i+1; EXIT WHEN i > 60; END LOOP; COMMIT; END;
就這樣,一個循環搞定。