MSSQL:SQL Server中刪除表字段及其關係的存儲過程腳本

CREATE PROCEDURE [dbo].[spDeleteColumnConstraint]
(
 @tablename  nvarchar(50),
 @columnname  nvarchar(50)
)
AS

 --刪除某字段的所有關係  

  declare   tb   cursor   local   for  
  --默認值約束  
  select   sql=‘alter   table   [‘+b.name+‘]   drop   constraint   [‘+d.name+‘]‘  
  from   syscolumns   a  
  join   sysobjects   b   on   a.id=b.id  
  join   syscomments   c   on   a.cdefault=c.id  
  join   sysobjects   d   on   c.id=d.id  
  where   b.name = @tablename  
  and   a.name = @columnname  
  union   all   --外鍵引用  
  select   s=‘alter   table   [‘+c.name+‘]   drop   constraint   [‘+b.name+‘]‘  
  from   sysforeignkeys   a  
  join   sysobjects   b   on   b.id=a.constid  
  join   sysobjects   c   on   c.id=a.fkeyid  
  join   syscolumns   d   on   d.id=c.id   and   a.fkey=d.colid  
  join   sysobjects   e   on   e.id=a.rkeyid  
  join   syscolumns   f   on   f.id=e.id   and   a.rkey=f.colid    
  where   e.name = @tablename
  and   d.name = @columnname 
  union   all --索引  
  select   case   e.xtype   when   ‘PK‘   then   ‘alter   table   [‘+c.name+‘]   drop   constraint   [‘+e.name+‘]‘  
  else   ‘drop   index   [‘+c.name+‘].[‘+a.name+‘]‘   end  
  from   sysindexes   a  
  join   sysindexkeys   b   on   a.id=b.id   and   a.indid=b.indid  
  join   sysobjects   c   on   b.id=c.id   and   c.xtype=‘U‘   and     c.name<>‘dtproperties‘  
  join   syscolumns   d   on   b.id=d.id   and   b.colid=d.colid  
  join   sysobjects   e   on   c.id=e.parent_obj  
  where   a.indid   not   in(0,255)  
  and   c.name=‘a‘  
  and   d.name=‘id‘  
   
  declare   @s   varchar(8000)  
  open   tb  
  fetch   next   from   tb   into   @s  
  while   @@fetch_status=0  
  begin  
  exec(@s)  
  fetch   next   from   tb   into   @s  
  end  
  close   tb  
  deallocate   tb

 DECLARE @SQL AS nvarchar(500)
  set @SQL = ‘Alter table ‘ + @tablename + ‘ Drop Column ‘ + @columnname  
  EXECUTE sp_executesql @SQL
GO

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章