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

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)。

(0)

相关推荐

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

    create proc addcolumn@tablename varchar(30), --表名@colname varchar(30), --要加的列名@coltype varchar(100), --要加的列类型@colid int --加到第几列as declare @colid_max intdeclare @sql varchar(1000) --动态sql语句--------------------------------------------------if not exist

  • SQL学习笔记五去重,给新加字段赋值的方法

    去掉数据重复 增加两个字段 alter TABLE T_Employee Add FSubCompany VARchar(20); ALTER TABLE T_Employee ADD FDepartment VARCHAR(20); 给新加的字段赋值 UPDATE T_Employee SET FSubCompany='Beijing',FDepartment='Development' where FNumber='DEV001'; UPDATE T_Employee SET FSubCom

  • SQL语句的执行原理分析

    原理:第一步:应用程序把查询SQL语句发给服务器端执行.我们在数据层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发送给服务器处理.第二步:服务器解析请求的SQL语句.1:SQL计划缓存,经常用查询分析器的朋友大概都知道这样一个事实,往往一个查询语句在第一次运行的时候需要执行特别长的时间,但是如果你马上或者在一定时间内运行同样的语句,会在很短的时间内返回查询结果. 原因:1):服务器在接收到查询请求后,并不会马上去数据库查询,而是在数据库中的计划缓存中找是否有相对应的执行计划

  • Mybatis如何实现@Select等注解动态组合SQL语句

    目录 一.背景说明 二.实现方案 三. 实现自定义注解 1.自定义Select注解 2.自定义Select in注解 3.自定义Update的注解 4.自定义Insert的注解 同理 四.注意事项&遇到的一些坑 五.总结 一.背景说明 由于以前在项目中一直使用sqlmap.xml进行mybatis语句的编写和实现,其xml实现动态更新和查询较为方便,而目前由于技术框架所定,采用@Select.@Insert等注解方式来实现对应的持久化操作(MyBatis提供了简单的Java注解,使得我们可以不配

  • sql高级技巧几个有用的Sql语句

    1.例如:有两个表A(字段1,字段2,字段3).B(字段2,字段3),其中存储数据如下所示表A 字段1 字段2 字段3 1 <Null> 地段内容1 1 <Null> 地段内容1 2 <Null> 地段内容2 2 <Null> 地段内容2 3 <Null> 地段内容3 4 <Null> 地段内容4 5 <Null> 地段内容5 5 <Null> 地段内容5 5 <Null> 地段内容5 6 <

  • SQL Server数据库的修复SQL语句

    出现这些情况的原因,往往是因为数据库有些损坏,或索引不完整. 在ACCESS中,有个修复数据库的功能可以解决这个问题,在SQL企业管理器,没有这个功能,要用语句来完成,下面就介绍如何用SQL语句完成数据库的修复,需要注意的是,在进行下面的操作时,必须断开所有用户的连接:  复制代码 代码如下: USE MASTER GO sp_dboption '你的数据库名', 'single user', 'true' Go DBCC CHECKDB('你的数据库名', REPAIR_REBUILD) Go

  • Java反射 JavaBean对象自动生成插入,更新,删除,查询sql语句操作

    通过反射根据提供的表名.POJO类型.数据对象自动生成sql语句. 如名为 User 的JavaBean与名为 user 的数据库表对应,可以提供一个封装有数据的User对象user,根据user中含有的数据自动生成sql语句. 1.生成插入语句(插入user中包含的非空数据的语句): String insertSql = getInsertSql("user", User.class, user); 2.生成更新语句(user中id不能为空): String updateSql =

  • 使用JPA插入枚举类型字段

    目录 JPA插入枚举类型字段 1. 插入枚举名称的值,即字符串 2. 插入枚举的序号,即ordinal 3.插入枚举中的自定义值 JPA枚举类型处理 JPA插入枚举类型字段 JPA插入枚举类型字段,有三种方式: 插入枚举字面值 插入枚举序号 插入枚举中自定义的值 例如,我们有个枚举类: public enum Gender {     BOY("1" , "boy" , "Boy");     GIRL("2" , "

  • C语言之实现单链表指定结点的插入方式

    目录 单链表指定结点的插入 链表之在指定结点前面或后面插入新的结点 单链表指定结点的插入 #include <bits/stdc++.h> using namespace std; typedef struct node { int data; struct node *next; }no; int main() { no *head,*tail,*p,*q; head=new no; head->next=NULL; tail=head; int n; printf("一共要

  • SQL语句执行深入讲解(MySQL架构总览->查询执行流程->SQL解析顺序)

    前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来探讨一下其中的知识. 一.MySQL架构总览: 架构最好看图,再配上必要的说明文字. 下图根据参考书籍中一图为原本,再在其上添加上了自己的理解. 从上图中我们可以看到,整个架构分为两层,上层是MySQLD的被称为的'SQL Layer',下层是各种各样对上提供接口的存储引擎,被称为'Storage Engin

随机推荐