当前位置:  数据库>sqlserver

根据sql脚本修改数据库表结构的几种解决方案

    来源: 互联网  发布时间:2014-10-13

    本文导语:  最近由于项目需要要做一个小工具。 需求:客户用的老库并存储了一些数据,用了一段时间,我们根据客户提出新功能在老库的基础上对新库进行修改。这些修改有很多细节方面的修改,包含存储过程,增加表,修改表字段类...

最近由于项目需要要做一个小工具。

需求:客户用的老库并存储了一些数据,用了一段时间,我们根据客户提出新功能在老库的基础上对新库进行修改。这些修改有很多细节方面的修改,包含存储过程,增加表,修改表字段类型,添加字段。

然后我们自己更新并测试好软件后,需要改动客户那边的老库,老库的数据是要保存的。

解决方案一:很快我就想到用SQL SERVER 08 R2 自带的功能,生成新库脚本。把老库改个名字,跑新库脚本,然后通过数据库自带功能把老库数据导入到新库数据。测试的时候,数据量不大,速度还比较理想。

但是这对客户来说还是很不方便的,且数据量大些还是比较费时的。于是,boss就让我做个小工具吧。

难道我要用程序实现以上操作,oh my god !

于是我想啊想。。。。

解决方案二:我就再细一些,直接操作数据库的表吧,对于数据库中存在的表,我给它重新命名,跑个新脚本建表,然后把老表中数据插进去。

相关SQL语句如下:

修改表名:EXEC sp_rename 'oldName' , 'newName'

插入数据:insert into newTable(column1,column2,.....) select column1,column2,..... from oldTable

更多相关操作:

参考数据库、表、列的重命名

列出参考内容来方便查看

一、更改数据库名

代码如下:

sp_renamedb
更改数据库的名称。

语法
sp_renamedb [ @dbname = ] ' old_name ' ,
[ @newname = ] ' new_name '

参数
[ @dbname = ] ' old_name '

是数据库的当前名称。old_name 为 sysname 类型,无默认值。

[ @newname = ] ' new_name '

是数据库的新名称。new_name 必须遵循标识符规则。new_name 为 sysname 类型,无默认值。

返回代码值
0 (成功)或非零数字(失败)

权限
只有 sysadmin 和 dbcreator 固定服务器角色的成员才能执行 sp_renamedb。

示例
下例将数据库 accounting 改名为 financial。

EXEC sp_renamedb ' accounting ' , ' financial '

二、更改表名或列名
代码如下:

sp_rename [ @objname = ] ' object_name ' ,
[ @newname = ] ' new_name '
[ , [ @objtype = ] ' object_type ' ]

/////////////////////////////////////////////
A. 重命名表
下例将表 customers 重命名为 custs。

EXEC sp_rename ' customers ' , ' custs '

B. 重命名列
下例将表 customers 中的列 contact title 重命名为 title。

EXEC sp_rename ' customers.[contact title] ' , ' title ' , ' COLUMN '

参考 复制表结构和表数据的SQL语句

列出参考内容来方便查看

1.复制表结构及数据到新表
CREATE TABLE 新表 SELECT * FROM 旧表

2.只复制表结构到新表
CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2

即:让WHERE条件不成立.

方法二:(由tianshibao提供)
CREATE TABLE 新表 LIKE 旧表

3.复制旧表的数据到新表(假设两个表结构一样)
INSERT INTO 新表 SELECT * FROM 旧表

4.复制旧表的数据到新表(假设两个表结构不一样)
INSERT INTO 新表(字段1,字段2,.......) SELECT 字段1,字段2,...... FROM 旧表

想到这,发现好像还少了点什么,呃,procedure和constraint,好吧,那我也先删除再添加
先查出来
select name from sys.procedures
select constraint_name, table_name from information_schema.table_constraints
再删除
drop procedure [dbo].[procedure_name]
alter table tableName drop CONSTRAINT [PK_ |FK_ |UK_ |DF_ |CK_]
这里再补充一些东西,关于约束前缀,参考SQL约束前缀
方便查看,再列出来
--主键
constraint PK_字段 primary key(字段),

--唯一约束
constraint UK_字段 unique key(字段),

--默认约束
constrint DF_字段 default('默认值') for 字段,

--检查约束
constraint CK_字段 check(约束。如:len(字段)>1),

--主外键关系
constraint FK_主表_从表 foreign(外键字段) references 主表(主表主键字段)

然后再从脚本中读取相应脚本文件并执行(加句废话:要执行多行脚本文件,CommandText里加'n'就好了)。

解决方案三:思来想去,为什么非要导入数据,直接改表结构就好了呀。于是读取表中字段

select column_name,data_type from information_schema.columns where table_name = 'tableName'
对于旧表中存在的字段
ALTER TABLE [tableName] ALTER COLUMN [columnName] [int] NOT NULL
对于旧表中不存在的字段
ALTER TABLE [tableName] ADD COLUMN [columnName] [int] NOT NULL

这样一来就不用导入数据就可以把旧库结构更新,其中除了运用一些ADO.NET方面的知识,还用到了正则表达式之类的来匹配脚本中相应的SQL命令。当然目前的方案还存在一些问题,这个工具还不够通用,对需要旧表多余的列并没有删除,还有容错性方面考虑得也不够周到。后期还会根据项目需要进一步改进的。

    
 
 

您可能感兴趣的文章:

  • t-sql/mssql用命令行导入数据脚本的SQL语句示例
  • SQL Server统计SQL语句执行时间的脚本
  • Shell脚本调用Sql脚本并向其中传递变量
  • PHP的SQL封装脚本 TbsSQL
  • 求助:linux脚本语言写SQL语句
  • 查询SQL Server中所有数据库的数据文件位置的sql脚本
  • SQL Server 2012无法连接到WMI提供程序(Cannot connect to WMI provider)解决方案 iis7站长之家
  • 怎么写一个Shell来执行这样的功能,访问Oracle数据库,然后执行一个SQL脚本,生成一个文件。急!
  • shell 执行oracle sql脚本的问题
  • SQL脚本中注释引起的奇怪问题的解决方法
  • 用来还原数据库的sql脚本
  • 简单的SQL Server备份脚本代码
  • oracle使用sql脚本生成csv文件案例学习
  • Sql Server 创建数据库脚本Create DATABASE
  • linux下如何将sql语句写为脚本
  • 解决在SQL脚本中的注释引起的奇怪问题
  • sql分类汇总及Select的自增长脚本
  • Shell脚本读文件运行SQL,然后写出结果。
  • 检验SQL Server备份的脚本
  • 一段脚本实现自动备份并保存最近几天的SQL数据库
  • sql无效字符 执行sql语句报错解决方案
  • MS SQL Server2014链接到MS SQL Server 2000的解决方案及问题处理
  • SQL Server 2012无法连接到WMI提供程序(Cannot connect to WMI provider)解决方案
  • SQL 超时解决方案 有时并不是设置问题
  • SQL实现递归及存储过程中In()参数传递解决方案详解
  • 关于sql server批量插入和更新的两种解决方案
  • sql server中批量插入与更新两种解决方案分享(存储过程)
  • 分享:sql server数据库大型应用的解决方案
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • sql数据库多用户模式修改方法
  • sql2005 默认端口的修改方法
  • SQL Server修改标识列方法 如自增列的批量化修改
  • 一条SQL语句修改多表多字段(多表更新)
  • Oracle中在pl/sql developer修改表的2种方法
  • sql 批量修改数据库表
  • sql数据库如何查询修改数据库恢复模式?
  • 修改数据库文件及日志文件增量的sql语句
  • sql 修改表的所有者
  • 一条SQL语句修改多表多字段的信息的具体实现
  • sql修改字段长度(练习)
  • sql数据库修改数据库用户
  • sql 添加删除修改字段的方法介绍
  • sql数据库修改sa密码操作教程
  • sql2005以上版本解决syscolumn表中数据无法修改问题
  • sql server 触发器实例(判断是插入、删除,还是修改)
  • sql server记录修改追踪和恢复的解决方法
  • 修改SQL Server 2005中数据库文件存放路径的方法
  • sql server 表结构修改方法
  • sql server数据库文件与日志文件存放位置怎么修改?
  • java命名空间java.sql接口statement的类成员方法: executeupdate定义及介绍
  • 请问,这是什么错误!java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][Named Pipes]??????? SQL Server?虽然分少,但一定给,只要您是前5名回复者中最好的以为!
  • java命名空间java.sql接口connection的类成员方法: nativesql定义及介绍
  • SQL查询分析工具 SQL Workbench/J
  • java命名空间java.sql接口preparedstatement的类成员方法: executeupdate定义及介绍
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • java命名空间java.sql接口rowid的类成员方法: getbytes定义及介绍
  • SQL客户端软件 PKLite SQL Client
  • java命名空间java.sql接口ref的类成员方法: getbasetypename定义及介绍
  • SQL语句实现SQL Server 2000及Sql Server 2005日志收缩(批量)
  • java命名空间java.sql接口databasemetadata的类成员方法: getsqlkeywords定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3