删除数据库表中的字段时,使用了 :alter table 表名 drop column 列名

服务器返回的错误为:
Server: Msg 5074, Level 16, State 1, Line 1
The object 约束名 is dependent on column 列名.
Server: Msg 4922, Level 16, State 1, Line 1
ALTER TABLE DROP COLUMN 列名 failed because one or more objects access this column.

解决方法是先删除所有关于这一列的约束,然后在开始删除这一列

下面的代码为删除表 B_File 中的 Name 列。

  1. DECLARE @sqlCmd nvarchar(1024);
  2. DECLARE @tbname nvarchar(180), --要处理的表名
  3. @fdname nvarchar(180), --要处理的字段名
  4. @delfield bit=1 --0只删除关系,1同时删除字段
  5.  
  6. set @tbname='B_File';
  7. set @fdname= 'Name';
  8.  
  9. BEGIN
  10. -- 定义游标.
  11. DECLARE c_test_main CURSOR FAST_FORWARD FOR
  12.  
  13. --默认值约束
  14. select sql='alter table ['+b.name+'] drop constraint ['+d.name+']'
  15. from syscolumns a
  16. join sysobjects b on a.id=b.id and a.name=@fdname and b.name=@tbname
  17. join syscomments c on a.cdefault=c.id
  18. join sysobjects d on c.id=d.id
  19. union --外键引用
  20. select s='alter table ['+c.name+'] drop constraint ['+b.name+']'
  21. from sysforeignkeys a
  22. join sysobjects b on b.id=a.constid
  23. join sysobjects c on c.id=a.fkeyid
  24. join syscolumns d on d.id=c.id and a.fkey=d.colid and d.name=@fdname
  25. join sysobjects e on e.id=a.rkeyid and e.name=@tbname
  26. join syscolumns f on f.id=e.id and a.rkey=f.colid
  27. union --主键/唯一键/索引
  28. select case when e.xtype in('PK','UQ') then 'alter table ['+c.name+'] drop constraint ['+e.name+']'
  29. else 'drop index ['+c.name+'].['+a.name+']' end
  30. from sysindexes a
  31. join sysindexkeys b on a.id=b.id and a.indid=b.indid
  32. join sysobjects c on b.id=c.id and c.xtype='U' and c.name=@tbname
  33. join syscolumns d on b.id=d.id and b.colid=d.colid and d.name=@fdname
  34. left join sysobjects e on e.id=object_id(a.name)
  35. where a.indid not in(0,255)
  36.  
  37. -- 打开游标.
  38. OPEN c_test_main;
  39. --填充数据.
  40. FETCH NEXT FROM c_test_main INTO @sqlCmd;
  41. --假如检索到了数据,才处理.
  42. WHILE @@fetch_status = 0
  43. BEGIN
  44. PRINT @sqlCmd;
  45. exec sp_executesql @sqlcmd;--执行约束的删除操作
  46.  
  47. --填充下一条数据.
  48. FETCH NEXT FROM c_test_main INTO @sqlCmd;
  49. END;
  50. -- 关闭游标
  51. CLOSE c_test_main;
  52. --释放游标.
  53. DEALLOCATE c_test_main;
  54. END;
  55. if @delfield=1
  56. begin
  57.  
  58. --判断表是否存在
  59. --if exists (select 1 from sys.tables where name=@tbname and type = 'u')
  60.  
  61. --判断列是否存在
  62. IF COL_LENGTH(@tbname, @fdname) IS not NULL
  63. exec('alter table ['+@tbname+'] drop column ['+@fdname+']')
  64. end

sql server 删除表字段和字段的约束的更多相关文章

  1. SQL比较两表字段和字段类型

    一.问题 业务需要把TB_Delete_KYSubProject表数据恢复到TB_KYSubProject,但提示错误,错误原因是两表字段类型存在不一致 insert into [TB_KYSubPr ...

  2. SQL Server 联表字段合并查询

    经常遇到统计报表中,子表记录合并为一个字段的情况.例如:省表中各省经济水平前五的城市统计. 有如下两表:dbo.省 和 dbo.市 (好吧,你可能会吐槽为什么用中文表名,其实我是为了方便查找替换) 这 ...

  3. SQL动态更新表字段 传入字段可能为空

    小技巧: 项目组有修改产品的基本信息字段 但有时候传入的字段可能为空 也可能不为空  动态修改表中字段. USE [BetaProductMarket_DB] GO )) BEGIN DROP PRO ...

  4. sql server 修改表字段信息

    alter table oa_archives_folder alter column folder_category varchar(200)

  5. mysql中修改表字段名/字段长度/字段类型详解

    在mysql中我们对数据表字段的修改命令只要使用alter就可以了,下面我来给大家详细介绍mysql中修改表字段名/字段长度/字段类型等等一些方法介绍,有需要了解的朋友可参考. 先来看看常用的方法 M ...

  6. SQL Server删除重复行的6个方法

    SQL Server删除重复行是我们最常见的操作之一,下面就为您介绍六种适合不同情况的SQL Server删除重复行的方法,供您参考. 1.如果有ID字段,就是具有唯一性的字段 delect   ta ...

  7. Sql Server删除数据表中重复记录 三种方法

    本文介绍了Sql Server数据库中删除数据表中重复记录的方法. [项目]数据库中users表,包含u_name,u_pwd两个字段,其中u_name存在重复项,现在要实现把重复的项删除![分析]1 ...

  8. SQL Server删除distribution数据库二

    以前总结过一遍博文SQL Server删除distribution数据库,里面介绍了如何删除distribution数据库.今天介绍一个删除distribution的特殊案例, 在这之前,我不知道这个 ...

  9. mysql,sql server,oracle 唯一索引字段是否允许出现多个 null 值?

    最近一个项目,涉及到sql server 2008,因为业务需求,希望建立一个唯一索引,但是发现在sql server中,唯一索引字段不能出现多个null值,下面是报错信息: CREATE UNIQU ...

随机推荐

  1. GLSL实现Interactive Fluid 流体【转】

    http://blog.csdn.net/a3070173/archive/2008/12/08/3479477.aspx 完成的部分: 1.流体本身的绘制和更新 未解决的部分: 1.由于采用经过抖动 ...

  2. [Angular2 Router] Use Params from Angular 2 Routes Inside of Components

    Angular 2’s ActivatedRoute allows you to get the details of the current route into your components. ...

  3. impdp的一些实际问题解决方法

    之前在http://blog.csdn.net/bisal/article/details/19067515写过一篇关于expdp和impdp的实践的帖子.今天碰到个问题,有些内容没有介绍全,这里再补 ...

  4. Python中的注释(转)

    一.单行注释     单行注释以#开头,例如:     print 6 #输出6 二.多行注释     (Python的注释只有针对于单行的注释(用#),这是一种变通的方法)      多行注释用三引 ...

  5. qt的安装和debug

    qt-opensource-windows-x86-msvc2013_64_opengl-5.3.0            这个已经包含了qt-creator-opensource-windows-x ...

  6. Laravel 5.1使用命令行模式(artisan)运行php脚本

    Laravel有内置命令调度器,可以方便的实现Cron. 任务调度定义在app/Console/Kernel.php文件的schedule方法中,该方法已经包含了一个示例.Laravel里有两种方法执 ...

  7. 学java入门到精通,不得不看的15本书

    学java入门到精通,不得不看的15本书 一.Java编程入门类1.<Java编程思想>2.<Agile Java>中文版 二.Java编程进阶类1.<重构 改善既有代码 ...

  8. hql & mysql 札记

    最近在某D实习,刚去就开始各种写HQL,碰壁很多次. 几个知识点记录一下,逐个攻破. sql 中的case when, 选择循环的写法.(http://www.cnblogs.com/zengen/a ...

  9. iOS webView与js交互在文本空格上输入文字

    项目要求:webview加载html网址,内容为填空题型文本,需要在横线上添加答案,并点击提交按钮后再将答案进行回显 正常加载的效果图片: 这个是用js交互后的效果图: 点击空格,输入想输入的答案,如 ...

  10. 利用css使文本在限制几行之后隐藏

    想要在布局中显示一段新闻的标题或是内容,特别是内容,东西超多...下面的方法就是通过css来控制文本显示多少的: 首先在html中写上: <p class="ellipsis" ...