数据库在设计的时候也许考虑不全面,致使某些字段类型不太准确。好比设计的时候是varchar(1024),可是实际使用的时候却发现过小了,装不下,因而须要修改字段类型为ntext什么的。sql
我最近就遇到了一个需求,须要修改20个字段的类型,把相同的脚本写20遍吗?NO,NO,NO!数据库
========================================================================spa
我有这么一张表“Attribute”,里面有60个字段,分别是Attribute0一、Attribute0二、Attribute0三、…… Attribute60。如今我须要把Attribute41到Attribute60的字段类型修改成ntext。设计
SQL Server:code
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:blog
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;
就这样,一个循环搞定。table