declare @table_name sysname ,@col_name sysname ,@Cur_col_name sysname ,@col_type sysname ,@Cur_col_type sysname ,@Default_val sysname ,@Cur_default_val sysname ,@isnull sysname ,@Cur_isnull sysname ,@key_str varchar(500) ,@error int declare @ind_info table (indname sysname, colname sysname, UNIQ sysname, CLU sysname, tag char(1) default ('0') ) BEGIN set @table_name='|^TableName^|' set @col_name='|^Column^|' set @Cur_col_name='|^NewColumn^|' set @col_type='|^Type^|' set @Cur_col_type='|^NewType^|' set @Default_val='|^Defalut^|' set @Cur_default_val='|^NewDefalut^|' set @isnull='|^Null^|' set @Cur_isnull='|^NewNull^|' SET @key_str='|^KeyString^|' declare @sql_command varchar(2000) ,@quotation_mark char(1) ,@create_PK sysname ,@del_PK sysname ,@key_name sysname ,@CLUSTER sysname ,@PINDNAME sysname ,@SP_INDNAME sysname ,@sp_COLNAME sysname ,@sp_UNIQ sysname ,@sp_CLU sysname ,@ind_name sysname BEGIN TRANSACTION INSERT INTO @IND_INFO(INDNAME,COLNAME,UNIQ,CLU) SELECT A.NAME,(SELECT NAME FROM SYSCOLUMNS WHERE ID=B.ID AND COLID=B.COLID) AS COLNAME, (CASE WHEN EXISTS(SELECT 1 FROM SYSOBJECTS WHERE NAME=A.NAME AND XTYPE='UQ') THEN 'UNIQUE' WHEN EXISTS(SELECT 1 FROM SYSOBJECTS WHERE NAME=A.NAME AND XTYPE='PK') THEN 'PRIMARY KEY' ELSE 'INDEX' END) AS UNIQ, (CASE WHEN A.INDID=1 THEN 'CLUSTERED' when A.INDID>1 then 'NONCLUSTERED' end) AS CLUSTER FROM SYSINDEXES A INNER JOIN SYSINDEXKEYS B ON A.INDID=B.INDID AND A.ID=B.ID WHERE a.ID=object_ID(@table_name) AND NOT EXISTS(SELECT 1 FROM SYSOBJECTS WHERE NAME=A.NAME AND XTYPE='PK') and (SELECT NAME FROM SYSCOLUMNS WHERE ID=B.ID AND COLID=B.COLID) NOT IN ('MTIME','SEQ') set @error=@error+@@ERROR delete from @ind_info where indname not in (select indname from @ind_info where colname=@col_name) set @error=@error+@@ERROR --delete index WHILE (SELECT COUNT(*) FROM @IND_INFO where tag='0')>0 BEGIN set @ind_name=(select top 1 INDNAME from @IND_INFO where tag=0) if exists(select 1 from @IND_INFO where INDNAME=@ind_name and UNIQ='UNIQUE') begin set @sql_command='ALTER TABLE '+@table_name+' DROP CONSTRAINT '+@ind_name end else begin set @sql_command='DROP INDEX '+@ind_name+' on '+@table_name end exec(@sql_command) set @error=@error+@@ERROR update @IND_INFO set tag=1 where INDNAME=@ind_name END set @quotation_mark='0' set @sql_command= 'alter table '+@table_name+' drop constraint '+ (select name from sysobjects where id=(select cdefault from syscolumns where name=@col_name and id=object_id(@table_name))) exec(@sql_command) SELECT @KEY_NAME=NAME,@CLUSTER=(CASE WHEN A.INDID=1 THEN ' CLUSTERED ' when A.INDID>1 then ' NONCLUSTERED ' end) FROM SYSINDEXES A WHERE EXISTS(SELECT 1 FROM SYSOBJECTS WHERE NAME=A.NAME AND XTYPE='PK') and EXISTS(SELECT 1 FROM SYSOBJECTS WHERE ID=A.ID AND XTYPE='U' AND name=@table_name) set @sql_command= 'ALTER TABLE '+@table_name+' DROP CONSTRAINT '+@key_name exec(@sql_command) set @error=@@ERROR if @col_type!=@Cur_col_type or @col_type!=@Cur_col_type or @isnull!=@Cur_isnull begin set @sql_command= 'alter table '+@table_name+ ' alter column '+@col_name+' '+@Cur_col_type+' '+@Cur_isnull exec(@sql_command) set @error=@error+@@ERROR end if @col_name!=@Cur_col_name begin set @sql_command= 'sp_rename '''+@table_name+'.'+@col_name+''','''+@Cur_col_name+''',''column''' exec(@sql_command) set @error=@error+@@ERROR end if isnull(@Cur_default_val,'')!='' begin if exists(select * from syscolumns where name=@Cur_col_name and id=object_id(@table_name) and xtype in (35,99,104,167,175,231,239,165)) begin set @quotation_mark='1' end set @sql_command= 'ALTER TABLE '+@table_name+' ADD CONSTRAINT [DF_'+@table_name+'_'+@Cur_col_name+']' +'DEFAULT '+(case when @quotation_mark='1' then '''' else '' end) +@Cur_default_val +(case when @quotation_mark='1' then '''' else '' end)+' FOR '+@Cur_col_name exec(@sql_command) set @error=@error+@@ERROR END set @CLUSTER=isnull(@CLUSTER,'') if(@key_str!='') begin set @sql_command= 'ALTER TABLE '+@table_name+' ADD CONSTRAINT [PK_'+@table_name+'] PRIMARY KEY '+@CLUSTER+'('+@key_str+')' exec(@sql_command) set @error=@error+@@ERROR --update index if @Cur_col_name!=@col_name begin update @IND_INFO set colname=@Cur_col_name where colname=@col_name set @error=@error+@@ERROR end --create index DECLARE SP_IND CURSOR FOR SELECT INDNAME,COLNAME,UNIQ,CLU FROM @IND_INFO open SP_IND FETCH NEXT FROM SP_IND INTO @SP_INDNAME,@SP_COLNAME,@SP_UNIQ,@SP_CLU SET @PINDNAME='' SET @sql_command=null WHILE(@@FETCH_STATUS=0) begin IF @SP_INDNAME!=@PINDNAME BEGIN SET @PINDNAME=@SP_INDNAME SET @sql_command=@sql_command+')' if @sql_command is not null begin exec(@sql_command) set @error=@error+@@ERROR end SET @sql_command='CREATE '+(case when @SP_UNIQ='' then @SP_UNIQ else '' end)+' '+@SP_CLU+' INDEX ' +@SP_INDNAME+' ON '+@table_name+' ('+@SP_COLNAME END ELSE BEGIN SET @sql_command=@sql_command+','+@SP_COLNAME END FETCH NEXT FROM SP_IND INTO @SP_INDNAME,@SP_COLNAME,@SP_UNIQ,@SP_CLU end SET @sql_command=@sql_command+')' exec(@sql_command) set @error=@error+@@ERROR CLOSE SP_IND DEALLOCATE SP_IND end if (@error != 0) begin ROLLBACK TRANSACTION end else begin COMMIT TRANSACTION end select @error as Error end