原文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. JavaScript之引用类型介绍

    引用类型的值(对象)是应用类型的一个实例.在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起,用于将数据和功能组织在一起.他们通常也被成为JavaScript中的类,但这种称 ...

  2. WinForm 控件的布局(Dock属性)的注意点

    对于Dock属性,添加控件的顺序会影响它们停驻的方式.例如,如果你对窗体添加控件A,指示其停驻填充(Fill), 然后你对窗体添加控件B并指示其停驻顶部(Top),控件B将覆盖控件A的上部.原因就是控 ...

  3. 记hive select distinct 多列 误区一则

    当select distinct a,b,c时,只会对a.b.c都起作用,无法达到只顾虑多余的a列: 根据hive官方网站说明:当有表 a b 10 1 10  2 10 3 此时select a,b ...

  4. R与数据分析旧笔记(三)不知道取什么题目

    连线图 > a=c(2,3,4,5,6) > b=c(4,7,8,9,12) > plot(a,b,type="l") 多条曲线效果 plot(rain$Toky ...

  5. R与数据分析旧笔记(十八完结) 因子分析

    因子分析 因子分析 降维的一种方法,是主成分分析的推广和发展 是用于分析隐藏在表面现象背后的因子作用的统计模型.试图用最少的个数的不可测的公共因子的线性函数与特殊因子之和来描述原来观测的每一分量 因子 ...

  6. Android 用属性动画自定义view的渐变背景

    自定义view渐变背景,同时监听手势自动生成小圆球. 宿主Activity如下: package com.edaixi.tempbak; import java.util.ArrayList; imp ...

  7. [C++]让CPU使用率曲线呈现为正弦曲线(一)

    看<编程之美>的第一题就很有意思: 写一个程序,让用户来决定Windows任务管理器的CPU占用率.可以实现下面三种情况: 1. CPU的占用率固定在50%,为一条直线: 2. CPU的占 ...

  8. Android Activity和Fragment传递数据

    1.Activity与Activity传递数据 UserLoginActivity.java: Intent welcomePage = new Intent(); Bundle dataBundle ...

  9. RedisTemplate.htm

    http://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/RedisTe ...

  10. Codeforces 703D Mishka and Interesting sum(树状数组+扫描线)

    [题目链接] http://codeforces.com/contest/703/problem/D [题目大意] 给出一个数列以及m个询问,每个询问要求求出[L,R]区间内出现次数为偶数的数的异或和 ...