SQL SERVER几种数据迁移/导出导入的实践

SQLServer提供了多种数据导出导入的工具和方法,在此,分享我实践的经验(只涉及数据库与Excel、数据库与文本文件、数据库与数据库之间的导出导入)。

(一)数据库与Excel

方法1:

使用数据库客户端(SSMS)的界面工具。右键选择要导出数据的数据库,选择“任务”——“导出数据”,下图1,按照向导一步一步操作即可。而导入则相反,导入时,SQLServer会默认创建一张新表,字段名也默认跟导入的Excel标题一样,并且会默认字段数据类型等。当然在可以在向导进行修改。需要注意的是如果标题不是英文而是中文,默认创建字段名也是中文,这将给后面数据更新操作带来麻烦,所以最好还是以有意义的英文字段名。把数据导入后,再通过执行语句,把数据插入/更新到业务表。

figure-1:任务——导出数据

方法2:

从SQLServer2005开始,可以直接在SSMS上查询出来的结果复制,然后粘贴到Excel上,对于少量数据来说,是非常快速方便的,需要注意的是长数字可能会变成科学记数法的形式,提前在Excel上指定列的格式为文本即可。

导入的话,ctrl + c 复制Excel上的数据,然后在选择相关表,编辑数据,把数据直接粘贴上去即可。但是不建议直接粘贴到业务表(如果表是空白没有数据,并且字段顺序对应,可以这样操作),而是建议先粘贴到一个新建的中间表中,然后再通过语句,把数据插入/更新到业务表。

这种方法的导出导入,适合于少量的数据,如5000行以内的记录,大于5000行以上就不建议了,速度较慢,如果数据过大,还一定成功。

(二)数据库与文本文件、数据库与数据库

数据库之间的数据迁移或导出导入其实是比较方便的,比如备份数据库后,在新的机器上做恢复。但是需要注意的是SQL2008之前的版本的备份无法在SQL2012或以上版本上直接恢复的,而是通过中间的SQL2008做一个过渡,把旧版本的数据库恢复到SQL2008,然后做备份,最后在SQL2012上恢复。

如果是新版本(下面以SQL2012为例)的备份文件恢复到旧版本(以SQL2008为例)上就比较麻烦了,一般是不支持新版本备份文件在旧版本中恢复的。只能通过编写脚本,把新版本的数据导入到旧版本中。

方法1:

首先推荐使用的是数据不落地的“链接服务器”。使用SQL2012的SSMS,同时连接到SQL2012和SQL2008的实例,通过编写脚本把SQL2012的数据导入到SQL2008中。两个实例的可以通过链接服务器来连接。以下是设置步骤。

figure-2:新建链接服务器

figure-3:链接服务器和数据源

figure-4:认证

figure-5:创建成功后,可以直接浏览链接服务器的目录,也可以使用语句查询了。

也可以使用脚本来创建链接服务器。

--创建链接服务器EXEC sp_addlinkedserver 
@server='LINKED_SERVER_TEST2',--被访问的服务器别名@srvproduct='',@provider='SQLOLEDB',@datasrc='192.168.88.6,11433'--数据源GO--创建登录名和密码EXEC sys.sp_addlinkedsrvlogin@rmtsrvname = 'LINKED_SERVER_TEST2', -- 被访问的服务器别名@useself = 'false',@locallogin = NULL,@rmtuser = 'sa', -- 数据源登录名@rmtpassword = 'psd123456' -- 数据源登录密码GO--设置数据可以访问EXEC sys.sp_serveroption@server = 'LINKED_SERVER_TEST2', 
@optname = 'data access',@optvalue = N'true'GO

code-1:创建链接服务器的脚本

创建成功后,可以直接查询数据。

figure-6:查询链接服务器的数据

通过视图sys.servers可以查询所有服务器及相关的属性。

figure-7:查询所有链接服务器

在SSMS上或运行以下脚本可以删除指定的链接服务器。

--删除链接服务器及所有登录EXEC sys.sp_dropserver @server = 'LINKED_SERVER_TEST2', @droplogins = 'droplogins'
 GO

code-2:删除链接服务器及所有登录

详细请参考:https://technet.microsoft.com/zh-cn/library/ff772782%28v=sql.105%29.aspx

方法2:

如果两个实例不能连接,只能在SQL2012上导出数据,再到SQL2008上导入。SQLServer提供生成包含数据的脚本工具,下图2。在第三步的“高级”选项里有一项“Types of data to scripts”有三个选择:Data only,Schema and data,Schema only,分别是只生成数据、生成表(对象)和数据,表(对象)。还有生成脚本的版本“Script for Server Version”,下图3。其他选项,按实际需要选择。

figure-8:任务——生成脚本

figure-9:生成脚本的高级选项

也可以使用存储过程生成包含数据的脚本。这里介绍一个别人已经做写好存储过程:sp_generate_inserts。运行之后,会按表每条记录生成一条insert的语句

View Code

code-3:sp_generate_inserts脚本源代码

在我的实际使用中,只有两三个参数比较常用,分别是@table_name、@from和@owner,如果表的架构使用默认的dbo,则可以省略。以下是一个使用的例子:

figure-10:使用sp_generate_inserts的一个例子

其他参数的用法,这里就不一一解释了。我经常使用这个存储过程做一些简单而少量(如数万行记录以内)的数据导出导入,比前面介绍的方法方便快捷许多。但这个存储过程支持处理一般常用的数据类型,像XML这种类型则不支持。还有,如果生成的数据太多太大,SSMS返回数据会很慢,甚至SSMS会挂了,这时还是使用SSMS自带的导出脚本到文件稳妥些。如果使用生成的数据脚本文件很大,几百MB甚至上GB,在导入时,就不能直接使用SSMS直接打开来执行了。可以使用SQLCMD实用工具来在执行脚本。如下面的一个例子,在D盘下有一个脚本1.sql,内容为:

USE AdventureWorks2008R2GOSELECT * FROM Person.CountryRegion;GO

code-4:SQLMCD的测试脚本

在运行下输入CMD,输入:

sqlcmd -S localhost -d AdventureWorks2008R2 -i D:\1.sql

code-5:SQLMCD的命令

回车执行后如下图,SQLCMD的详细用法,请参考:https://msdn.microsoft.com/zh-cn/library/ms180944.aspx

https://msdn.microsoft.com/zh-cn/library/ms162773%28v=sql.105%29.aspx

figure-11:SQLCMD的测试例子

方法3:

使用BCP导出导入大容量数据。可以参阅我的另一篇博客《BCP导出导入大容量数据实践》。

以上几种方法是我在日常工作比较常使用的数据导出导入的工具,每一种方法都有各自的优势和不同的使用场景,使用不同的方法组合,可以节省不少时间,提高工作效率,希望对您的有所帮助。如果您有更好的建议或方法欢迎告诉我!

原文发布于微信公众号 - 我为Net狂(dotNetCrazy)

原文发表时间:2016-03-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏日常分享

Oracle常用数据库系统表单以及SQL的整理

  因为最近涉及到了一些数据库的归档,备份等工作,所以一部分的重心放在了数据库上,毕竟之前对数据库的了解也只停留在了一般的建表,查询,最多最多再写一写触发器之类...

1261
来自专栏C/C++基础

MySQL设置远程访问

在MySQL Server端,执行mysql 命令进入mysql 命令模式。使用grant命令用来建立新用户,指定用户口令并增加用户权限。命令格式如下:

1291
来自专栏乐沙弥的世界

基于CentOS 7安装Zabbix 3.4

Zabbix 是一个企业级的分布式开源监控方案。能够监控各种网络参数以及服务器健康性和完整性。支持灵活的通知机制,提供出色的报告和数据可视化功能。Zabbix支...

1513
来自专栏林欣哲

MySQL数据库备份和恢复

2032
来自专栏云计算教程系列

如何在Debian 8上安装和使用PostgreSQL 9.4

关系数据库是满足多种需求的数据组织的基石。它们支持从网上购物到火箭发射的各种功能。PostgreSQL是一个既古老但仍然存在的数据库。PostgreSQL遵循大...

2160
来自专栏python3

解决centos7 /etc/rc.local 不能执行

最近发现centos7 的/etc/rc.local不会开机执行,于是认真看了下/etc/rc.local文件内容的就发现了问题的原因了

1322
来自专栏数据库

SQLite 使用方法详解

提供了对 SQLite 数据库的完全支持。应用中的任何类(不包括应用外部的类)均可按名称访问您所创建的任何数据库。如果想让自己创建的数据库供外部应用使用,请使用...

2226
来自专栏Danny的专栏

SQL Server 2008 附加数据库时出错

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

1.8K3
来自专栏云计算教程系列

如何在Ubuntu 18.04上安装和使用PostgreSQL

关系数据库管理系统是许多网站和应用程序的关键组件。它们提供了一种存储,组织和访问信息的结构化方法。

3086
来自专栏醉梦轩

Ubuntu 16.04 部署MySQL服务

MySQL是一款开源的关系型数据库管理系统,大量公司都在使用它,或是在它的基础上做二次开发。有时,我们会需要在Linux系统上部署MySQL服务用于测试。

1792

扫码关注云+社区