如何用SQL语句在指定字段前面插入新的字段?

2007-10-17 09:28:00|  分类: 笔记|举报|字号 订阅

 
 
create proc addcolumn 
@tablename varchar(30), --表名 
@colname varchar(30), --要加的列名 
@coltype varchar(100), --要加的列类型 
@colid int --加到第几列 
as

declare @colid_max int 
declare @sql varchar(1000) --动态sql语句 
-------------------------------------------------- 
if not exists(select 1 from sysobjects 
where name = @tablename and xtype = 'u') 
begin 
raiserror 20001 '没有这个表' 
return -1 
end 
-------------------------------------------------- 
if exists(select 1 from syscolumns 
where id = object_id(@tablename) and name = @colname) 
begin 
raiserror 20002 '这个表已经有这个列了!' 
return -1 
end 
-------------------------------------------------- 
--保证该表的colid是连续的 
select @colid_max = max(colid) from syscolumns where id=object_id(@tablename)

if @colid > @colid_max or @colid < 1 
set @colid = @colid + 1 
-------------------------------------------------- 
set @sql = 'alter table '+@tablename+' add '+@colname+' '+@coltype 
exec(@sql)

select @colid_max = colid 
from syscolumns where id = object_id(@tablename) and name = @colname 
if @@rowcount <> 1 
begin 
raiserror 20003 '加一个新列不成功,请检查你的列类型是否正确' 
return -1 
end 
-------------------------------------------------- 
--打开修改系统表的开关 
EXEC sp_configure 'allow updates',1 RECONFIGURE WITH OVERRIDE

--将新列列号暂置为-1 
set @sql = 'update syscolumns 
set colid = -1 
where id = object_id('''+@tablename+''') 
and colid = '+cast(@colid_max as varchar(10)) 
exec(@sql)

--将其他列的列号加1 
set @sql = 'update syscolumns 
set colid = colid + 1 
where id = object_id('''+@tablename+''') 
and colid >= '+cast(@colid as varchar(10)) 
exec(@sql)

--将新列列号复位 
set @sql = 'update syscolumns 
set colid = '+cast(@colid as varchar(10))+' 
where id = object_id('''+@tablename+''') 
and name = '''+@colname +'''' 
exec(@sql) 
-------------------------------------------------- 
--关闭修改系统表的开关 
EXEC sp_configure 'allow updates',0 RECONFIGURE WITH OVERRIDE 
go

调用方法: 
exec addcolumn '表名','新列名','新列类型',加到第几个位置 
如: 
exec addcolumn 'test','id2','char(10)',2 
表示将id2这个列加到表test的第二个位置,类型是char(10)。

------------------------------------------------------

上面的是纯SQL语句的实现方法。当然,也可以把需要修改后的字段顺序先select...into...到一个临时表,然后drop旧表,把临时表复制或者改名过来,也可以实现原来需要的功能。但是这样如果需要修改的表一多,就会给数据库带来很多日志,而且可能会丢掉原来的字段关系。所以还是要看情况选择使用。

如何用SQL语句在指定字段前面插入新的字段?的更多相关文章

  1. 如何用sql语句复制一张表

    如何用sql语句复制一张表 1.复制表结构及数据到新表 CREATE TABLE 新表 SELECT * FROM 旧表 这种方法会将oldtable中所有的内容都拷贝过来,当然我们可以用delete ...

  2. 如何用SQL语句查询Excel数据?

    如何用SQL语句查询Excel数据?Q:如何用SQL语句查询Excel数据? A:下列语句可在SQL SERVER中查询Excel工作表中的数据. 2007和2010版本: SELECT*FROMOp ...

  3. mysql里面如何用sql语句让字符串转换为数字

    sql语句将字符串转换为数字默认去掉单引号中的空格,遇到空格作为字符串截止, SELECT '123 and 1=1' +0 结果为123 MySQL里面如何用sql语句让字符串的‘123’转换为数字 ...

  4. SQL语句往Oracle数据库中插入日期型数据(to_date的用法)

    Oracle 在操作数据库上相比于其他的 T-sql 有微小的差别,但是在插入时间类型的数据是必须要注意他的 to_date 方法,具体的情况如下: --SQL语句往Oracle数据库中插入日期型数据 ...

  5. 【转载】C#中使用Insert方法往ArrayList集合指定索引位置插入新数据

    ArrayList集合是C#中的一个非泛型的集合类,是弱数据类型的集合类,可以使用ArrayList集合变量来存储集合元素信息,在ArrayList集合操作过程中,可以使用ArrayList集合类的I ...

  6. mysql中通过sql语句查询指定数据表的字段信息

      mysql数据库在安装完成时,自动创建了information_schema.mysql.test这三个数据库.其中,information_schema记录了创建的所有数据库的相关信息,因此可以 ...

  7. 用SQL语句建库建表建约束(用SQl语句在指定盘符创建文件夹)

    一 :创建数据库 创建一个数据文件和一个日志文件(MySchool) create database MySchoolon primary      --默认属于primary主文件组,可省略(--数 ...

  8. 数据库SQL语句查询指定时间段内的数据

    [摘要]有的时候,我们需要查询数据库某段时间之间的数据,比如2016年5月1号到到5月3号之间用户注册数量(特殊节假日期间)等.那么用SQL语句如何实现呢? 首先,数据表中的存时间的字段比如是addt ...

  9. 如何用SQL语句实现Mysql数据库的备份与还原

    以前一直做android客户端的项目,根本没有开发asp.net mvc的开发,现阶段做了一个模块,参数设置,以及数据库的备份与还原.其需求如下: 参数设置 本项参数设置为对自动数据备份进行设置,管理 ...

随机推荐

  1. [USACO 2017DEC] Haybale Feast

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5142 [算法] 首先用RMQ预处理S数组的最大值 然后我们枚举右端点 , 通过二分求 ...

  2. 珠宝 jewelry 省选模拟

    n种珠宝.每种各1个.有价格ci元,美度vi.  要求分别输出1元到m元 可买的最大优美度. 整数 :0<n<=10000000, 0<ci<=300,0<=vi< ...

  3. bzoj1047 [HAOI2007]理想的正方形——二维单调队列

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1047 就是先对行做一遍单调队列,再对那个结果按列做一遍单调队列即可. 代码如下: #incl ...

  4. Wireshark抓包分析TCP协议

      版权声明:本文为作者原创文章,可以随意转载,但必须在明确位置表明出处!!! 之前有一篇文章介绍了http协议「初识http协议」, http协议协议是基于tcp协议的,所以作者觉得有必要针对tcp ...

  5. bzoj 3566: [SHOI2014]概率充电器【树形概率dp】

    设g[u]为这个点被儿子和自己充上电的概率,f[u]为被儿子.父亲和自己充上电的概率 然后根据贝叶斯公式(好像是叫这个),1.P(A+B)=P(A)+P(B)-P(A)*P(B),2.P(A)=(P( ...

  6. Element-wise operations

    Element-wise operations An element-wise operation operates on corresponding elements between tensors ...

  7. Taro 采坑日常

    组件事件传参只能在类作用域下的确切引用(this.handleXX || this.props.handleXX),或使用 bind. 组件中点击事件如下 // 组件 <AtListItem k ...

  8. [Usaco2006 Open]The Climbing Wall 攀岩

    Description One of the most popular attractions at the county fair is the climbing wall. Bessie want ...

  9. Hdu 5384 Danganronpa (AC自动机模板)

    题目链接: Hdu 5384 Danganronpa 题目描述: 给出n个目标串Ai,m个模式串Bj,问每个目标串中m个模式串出现的次数总和为多少? 解题思路: 与Hdu 2222  Keywords ...

  10. _bzoj1012 [JSOI2008]最大数maxnumber【Fenwick Tree】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1012 裸的树状数组. #include <cstdio> #include &l ...