原文MSSQL 如何删除字段的所有约束和索引

代码如下:

    1. ----------------------------------------------------------
    2. --  mp_DropColConstraint
    3. --  功能:删除某个表的某列的所有约束
    4. --  入口:
    5. --      @TableName NVARCHAR(128)    -- 表名
    6. --      @ColumnName NVARCHAR(128)   -- 列名
    7. ----------------------------------------------------------
    8. if OBJECT_ID(N'dbo.mp_DropColConstraint', N'P') is not null
    9. drop procedure dbo.mp_DropColConstraint
    10. go
    11. create procedure dbo.mp_DropColConstraint
    12. @TableName NVARCHAR(128),
    13. @ColumnName NVARCHAR(128)
    14. as
    15. begin
    16. if OBJECT_ID(N'#t', N'TB') is not null
    17. drop table #t
    18. -- 查询主键约束、非空约束等
    19. select ROW_NUMBER() over(order by CONSTRAINT_NAME) id, CONSTRAINT_NAME into #t from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE where TABLE_CATALOG=DB_NAME()
    20. and TABLE_NAME=@TableName and COLUMN_NAME=@ColumnName
    21. -- 查询默认值约束
    22. declare @cdefault int, @cname varchar(128)
    23. select @cdefault=cdefault from sys.syscolumns where name=@ColumnName and id=OBJECT_ID(@TableName)
    24. select @cname=name from sys.sysobjects where id=@cdefault
    25. if @cname is not null
    26. insert into #t select coalesce(max(id), 0)+1, @cname from #t
    27. declare @i int, @imax int
    28. select @i=1, @imax=max(id) from #t
    29. while @i <= @imax
    30. begin
    31. select @cname=CONSTRAINT_NAME from #t where id=@i
    32. exec('alter table ' + @tablename + ' drop constraint ' + @cname)
    33. set @i = @i + 1
    34. end
    35. drop table #t
    36. end
    37. go
    38. -----------------------------------------
    39. --  mfn_IsColumnExists
    40. --  功能:判断字段是否存在
    41. --  入口:
    42. --      @TableName NVARCHAR(128)    -- 表名
    43. --      @ColumnName NVARCHAR(128)       -- 列名
    44. --  出口:
    45. --      BIT  1=存在,0=不存在
    46. ----------------------------------------
    47. if OBJECT_ID(N'dbo.mfn_IsColumnExists', N'FN') is not null
    48. drop function dbo.mfn_IsColumnExists
    49. go
    50. create function dbo.mfn_IsColumnExists(@TableName NVARCHAR(128), @ColumnName NVARCHAR(128))
    51. returns bit
    52. as
    53. begin
    54. declare @rt bit
    55. set @rt=0
    56. if (select name from sys.syscolumns where name=@ColumnName and id=OBJECT_ID(@TableName)) is not null
    57. set @rt=1
    58. return @rt
    59. end
    60. go
    61. --------------------------------------------------
    62. --  mfn_GetColumnIndexes
    63. --  功能:查询某个字段的所有索引
    64. --  入口:
    65. --      @TableName NVARCHAR(128) -- 表名
    66. --      @ColumnName NVARCHAR(128) -- 列名(字段名)
    67. --  出口:返回一个结果集:
    68. --      id int -- 序号,从1开始
    69. --      name nvarchar(128) -- 索引名称
    70. --------------------------------------------------
    71. if OBJECT_ID(N'dbo.mfn_GetColumnIndexes', N'TF') is not null
    72. drop function dbo.mfn_GetColumnIndexes
    73. go
    74. create function dbo.mfn_GetColumnIndexes(@TableName NVARCHAR(128), @ColumnName NVARCHAR(128))
    75. returns @ret table
    76. (
    77. id int,
    78. name NVARCHAR(128)
    79. )
    80. as
    81. begin
    82. declare @tid int, @colid int
    83. -- 先查询出表id和列id
    84. select @tid=OBJECT_ID(@tablename)
    85. select @colid=colid from sys.syscolumns where id=@tid and name=@columnname
    86. -- 查询出索引名称
    87. insert into @ret select ROW_NUMBER() OVER(ORDER BY cols.index_id) as id, inds.name idxname from sys.index_columns cols
    88. left join sys.indexes inds on cols.object_id=inds.object_id and cols.index_id=inds.index_id
    89. where cols.object_id=@tid and column_id=@colid
    90. return
    91. end
    92. go
    93. --------------------------------------------------
    94. --
    95. --  mp_DropColumnIndexes
    96. --  功能:删除指定列的所有索引
    97. --  入口:
    98. --      @TableName NVARCHAR(128) 表名
    99. --      @ColumnName NVARCHAR(128) 列名
    100. --------------------------------------------------
    101. if OBJECT_ID(N'dbo.mp_DropColumnIndexes', N'P') is not null
    102. drop procedure dbo.mp_DropColumnIndexes
    103. go
    104. create procedure dbo.mp_DropColumnIndexes
    105. @TableName NVARCHAR(128),
    106. @ColumnName NVARCHAR(128)
    107. as
    108. begin
    109. if OBJECT_ID(N'#t', N'TB') is not null
    110. drop table #t
    111. create table #t
    112. (
    113. id int,
    114. name nvarchar(128)
    115. )
    116. insert into #t select * from mfn_GetColumnIndexes(@TableName, @ColumnName)
    117. -- 删除索引
    118. declare @i int, @imax int, @idxname nvarchar(128)
    119. select @i=1, @imax=COALESCE(max(id), 0) from #t
    120. while @i<=@imax
    121. begin
    122. select @idxname=name from #t
    123. EXEC('drop index ' + @idxname + ' on ' + @tablename)
    124. set @i=@i+1
    125. end
    126. drop table #t
    127. end
    128. go
    129. ------------------------------------------------
    130. --  mp_DropColConstraintAndIndex
    131. --  功能:删除指定字段的所有约束和索引
    132. --  入口:
    133. --      @TableName NVARCHAR(128)    -- 表名
    134. --      @ColumnName NVARCHAR(128)   -- 列名
    135. ------------------------------------------------
    136. if OBJECT_ID(N'dbo.mp_DropColConstraintAndIndex', N'P') is not null
    137. drop procedure dbo.mp_DropColConstraintAndIndex
    138. go
    139. create procedure dbo.mp_DropColConstraintAndIndex
    140. @TableName NVARCHAR(128),
    141. @ColumnName NVARCHAR(128)
    142. as
    143. begin
    144. exec dbo.mp_DropColConstraint @TableName, @ColumnName
    145. exec dbo.mp_DropColumnIndexes @TableName, @ColumnName
    146. end
    147. go

MSSQL 如何删除字段的所有约束和索引的更多相关文章

  1. mysql 在已存在的表中添加/删除字段约束AUTO_INCREMENT遇到的问题

    1. 在已存在的表中添加字段约束AUTO_INCREMENT修饰符 mysql> alter table user modify uid int auto_increment primary k ...

  2. mssql数据库添加,修改,删除字段

    通用式: alter table [表名] add [字段名] 字段属性 default 缺省值 default 是可选参数 增加字段: alter table [表名] add 字段名 smalli ...

  3. MSSQL删除字段时出现 服务器: 消息 5074,级别 16,状态 1,行 1 的解决办法

    有的朋友在做用户维护字段的界面时,肯定发现一个问题,当用脚本:ALTER TABLE 表名 DROP COLUMN 字段名进行删除字段的操作时,会出现“服务器: 消息 5074,级别 16,状态 1, ...

  4. sql 创建表、删除表 增加字段 删除字段操作

    下面是Sql Server 和 Access 操作数据库结构的常用Sql,希望对你有所帮助. 新建表:create table [表名]([自动编号字段] int IDENTITY (1,1) PRI ...

  5. Mysql字段操作—增加字段、删除字段、修改字段名、修改字段类型(约束条件)

    1.增加字段:    alter table   tablename    add   new_field_id   type   not null default '0';     例:     a ...

  6. Oracle 增加修改删除字段与添加注释

    添加字段的语法:alter table tablename add (column datatype [default value][null/not null],….); 修改字段的语法:alter ...

  7. Oracle 增加修改删除字段

    Oracle 增加修改删除字段 添加字段的语法:alter table tablename add (column datatype [default value][null/not null],…. ...

  8. .Net程序员学用Oracle系列(6):表、字段、注释、约束、索引

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.表 1.1.创建表 1.2.修改表 & 删除表 2.字段 2.1.添加字段 2.2.修改字段 & 删除字段 ...

  9. SqlServer2012-创建表、删除表 增加字段 删除字段操作

    新建表:create table [表名]([自动编号字段] int IDENTITY (1,1) PRIMARY KEY ,[字段1] nVarChar(50) default \'默认值\' nu ...

随机推荐

  1. android之PackageManager简介

    PackageManager相关 本类API是对所有基于加载信息的数据结构的封装,包括以下功能: 安装,卸载应用查询permission相关信息 查询Application相关信息(applicati ...

  2. Android入门——UI(7)——Fragment

    先上fragment静态加载的代码 <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...

  3. Android布局绘制常见小问题

    一些网上分享的整理 1.Android设置Selector不同状态下颜色及图片 Selector常用状态: android:state_selected 控件选中状态,可以为true或false an ...

  4. BZOJ 1559: [JSOI2009]密码( AC自动机 + 状压dp )

    建AC自动机后, dp(x, y, s)表示当前长度为x, 在结点y, 包括的串的状态为s的方案数, 转移就在自动机上走就行了. 对于输出方案, 必定是由给出的串组成(因为<=42), 所以直接 ...

  5. C++学习之引用

    C++学习之引用         临时变量.引用参数和const         现在,当参数为const引用的时候,如果实参与引用参数不匹配,C++将生成临时变量.C++将在下面两种情况下生成临时变 ...

  6. 有一个警告:Could not open/create prefs root node

    WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. 虽然程序也能正常运 ...

  7. Java NIO read/write file through FileChannel

    referee:  Java NIO FileChannel A java nio FileChannel is an channel that is connected to a file. Usi ...

  8. (Problem 39)Integer right triangles

    If p is the perimeter of a right angle triangle with integral length sides, {a,b,c}, there are exact ...

  9. 利用KVC实现无需协议的委托模式

    在<精通iOS开发>一书中看到的技巧.假设BIDTaskListController是一个列表,点击列表上的一项将会导航到BIDTaskDetailController,在BIDTaskD ...

  10. Android Layout Binder(在线将XML中View find出来,生成java代码的工具)

    废话不多说,这是地址:http://android.lineten.net/layout.php. 有图有真相,比如: 你的XML假如是这样: <?xml version="1.0&q ...