/**//* 原创:fcuandy 修改:bing110 功能:动态传入“表名,字段名,字段类型,默认值”四个字符串,根据新的字段名称和类型来创表表结构 不足:由于修改的表时候保留原来字段的数据,所以现在暂时还不能修改字段类型,创建的表中也不能创建索引,外键约束等功能 日期:2008-9-9 */ CREATEFUNCTION dbo.Split --自定义的拆分函数,用来装传入的字符串分隔成表 ( @ItemListVARCHAR(4000), @delimiterVARCHAR(10) ) RETURNS@IDTableTABLE (IndexID INTIDENTITY(1,1),Item VARCHAR(50)) AS BEGIN WHILECHARINDEX(@delimiter, @ItemList)>0 BEGIN INSERT@IDTableSELECTLEFT(@ItemList,CHARINDEX(@delimiter,@ItemList)-1) SET@ItemList=STUFF(@ItemList,1,CHARINDEX(@delimiter,@ItemList),'') END INSERT@IDTableSELECT@ItemList RETURN END CREATEPROC P_Alter_Table @tbVARCHAR(100), --表名 @fieldsListsVARCHAR(1000), --字段列表 @fieldsTypeListsVARCHAR(1000), --字段类型列表,需要与字段列表一一对应 @DefaultValueVARCHAR(1000) --新增字段默认值,与字段一一对应 AS BEGIN DECLARE@sqlVARCHAR(8000) DECLARE@sql1VARCHAR(8000),@sql2VARCHAR(8000),@Sql0VARCHAR(8000) IFobject_id(@tb,'u') ISNULL--若表不存在 BEGIN SELECT@sql=ISNULL(@sql+',','') +'['+ a.Item +'] '+ b.Item +' Default '+CHAR(39)+ c.Item +CHAR(39) FROM dbo.Split(@fieldsLists,',') a INNERJOIN dbo.Split(@fieldsTypeLists,',') b ON a.IndexID=b.IndexID INNERJOIN dbo.Split(@DefaultValue,',') C ON a.IndexId=C.IndexId EXEC('CREATE TABLE ['+@tb+']('+@sql+')') END ELSE--若表存在 BEGIN SELECT@sql1='',@sql2='',@sql0='' SELECT@sql1=@sql1+CASEWHEN Field ISNULLTHEN'['+name+'],'ELSE''END,--记录待删除列列表 @Sql0=@Sql0+CASEWHEN Field ISNULLAND CDEFAULT <>0THEN (SELECT[NAME]FROM SYSOBJECTS WHERE ID=CDEFAULT) +','ELSE''END, --记录待删除的默认值 @sql2=@sql2+CASEWHEN Name ISNULLTHEN'['+Field+'] '+ FType +' Default '+CHAR(39)+ DValue +CHAR(39)+','ELSE''END--记录待新增列列表 FROM (SELECT[NAME],CDEFAULT FROM syscolumns WHERE id=object_id(@tb,'u')) a FULLOUTERJOIN ( SELECT b.Item Field,a.Item FType,c.Item DValue FROM dbo.Split(@fieldsLists,',') b INNERJOIN dbo.Split(@fieldsTypeLists,',') a ON a.IndexID=b.IndexID INNERJOIN dbo.Split(@DefaultValue,',') c ON a.IndexId=c.IndexId ) b ON name=Field SELECT@sql1=STUFF(@sql1,LEN(@sql1),1,''),@sql2=STUFF(@sql2,LEN(@sql2),1,''),@sql0=STUFF(@sql0,LEN(@sql0),1,'') IFLEN(@sql2)>0 EXEC('ALTER TABLE ['+@tb+'] ADD '+@sql2) --先加原表中不存在的列 IFLEN(@Sql0)>0 EXEC('ALTER TABLE ['+@TB+'] DROP CONSTRAINT '+@Sql0) --删除表中不需要字段的默认值 IFLEN(@sql1)>0 EXEC('ALTER TABLE ['+@tb+'] DROP COLUMN '+@sql1) --再删除新传入结构中不需要的列 END END Eg: EXEC P_ALTER_TABLE 'A','A1,A2','INT,VARCHAR(10)','0,T' SELECT*FROM A