数据库在设计的时候也许考虑不全面,导致某些字段类型不太准确。比如设计的时候是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;
就这样,一个循环搞定。