原汁原味的COPY:BCP实用工具

由于日常基本都是与数据库打交道,我会经常遇到数据转移的需求。类似于:将服务器A的表数据转移到服务器B的同名表中,或将线上服务器的一部分数据拉到线下测试服务器供开发人员调试。通常来说,有以下几种表到表的复制方法:

1.建链接服务器,写INSERT语句。 适用于两台服务器能互相连接,在表的数量比较少的情况下,手动写INSERT语句还是可以接受的。但如果两台服务器无法互联或连接速度较慢,或者多个表需要手写插入列名,写起来会很麻烦,还要调试语句。

2.查询出所有数据或需要导出的数据或用导出工具存成EXCEL,再用导入工具导入目标表。对于数据量不大、比较标准、可以规则的存成EXCEL的数据可以使用这种方法,反之会有各种问题,最常见的就是大文本在导出成EXCEL后经常会无法原样导入,报各种格式错。

3.查出需要导出的数据,复制一下,在SSMS的编辑两200行中选中行复制。这种方法和第二种问题类似,更快一点,但要求也更严。要求更小的数据量,更规则的数据。

4.原库做备份--目标服务器还原备份--跨库插入数据或者直接用还原的库。这种能完全COPY多个表,但缺点一是麻烦,二是需要登陆到服务器上复制备份文件下来,这在管理严密的公司里很可能是要领导签字的。大家懂的,所以我也不常用这种方法。

--感谢帖子中的shoppo0505网友补充,我少说了一种方法

6.使用SSMS的生成脚本功能,在选项中选择生成数据脚本(2008和R2不一样,一个是有个是和否,另一个是三个选项:生成、生成和数据、数据),能生成表中所有INSERT的语句,也可以原样复制,对于超大的数据量,生成的脚本也是超超大的,一般来说小于1W行的数据可以使用。

5.BCP实用工具,也就是本文要介绍的,我现在最常用的数据迁移工具。无视大文本的不规则字符,无视大数据量,通过中间文件传输,不必登陆服务器本机。下面就从最简单的例子入手,介绍一下BCP的用法。

假设源表名T1,数据库名DB1,服务器器实例为SERVER1,目标表名T2,数据库名DB2,服务器实例为SERVER2。T1和T2的结构完全一样。T2中主键与T1不重复或者直接是空表。


首先是导出语句:

BCP DB1.DBO.T1 out d:\T1.dat -S SERVER1 -U sa -P sa -n

在一台能连接SERVER1的装有SQLSERVER的机器上(比如SERVER1本机)的命令行CMD中运行这句命令,就会开始运行导出程序,完成后,会在D盘生成一个名为T1.dat的文件。把这个文件COPY到一台能连接SERVER2,装有SQLSERVER的机器上,运行下面的导入语句:

BCP DB2.DBO.T2 in d:\t1.dat -S SERVER2 -U sa -P sa -n

这样就可以了。

下面就对上面两个语句做一下说明。


BCP是命令,不解释。

DB1.DBO.T1是指定库名、架构名和表名。

out/in是确定方向,out是表导出,in是表导入。out可以改成queryout,对应的前面要改成查询语句,也就是从DB1.DBO.T1改成"SELECT * FROM DB1.DBO.T1 WHERE ...."这样的,实现指定数据导出。

d:\T1.dat是指定文件路径。文件名和后缀名都是随便写的,我只是习惯用这种写法,因为我会经常做多个表的BCP导出,命名规律一点方便通过表名拼BCP语句。

-S -U -P 分别是指定实例名、用户名和密码,权限的话out需要select权限,in需要SELECT和INSERT权限,如果指定了几个特殊选项,比如标识列原样插入,还需要ALTER TABLE权限。

-n是指定格式,这里是指定了使用本机格式(-n),数据会以16进制的形式存储于文件中,因此不存在大文本干扰格式的问题,只要两个表的结构完全一样,一定会成功的。

还有一些其它的格式,如-c,是为了给不同类型的数据库(如MYSQL或ORACLE)导入用的,它会导出成标准的文本格式,但这就会导致一些含乱码和不规则字符的大文本干扰导入,所以我在不关注数据文件内容的时候都是用-n的格式的。


此外还有一些扩展参数,如添加-E后开启标识列原样插入,用于原样复制含有IDENTITY列的表。-b指定批大小,-F和-L指定起始和终止行数。想了解的可以去MSDN的说明上自己了解,我就不多复制了,只提供原文地址:

http://msdn.microsoft.com/zh-cn/library/ms162802.aspx


注意除了BCP和IN/OUT,后面的所有参数都是大小写敏感,-S不要写成-s,-n和-N的含义也不同。

---------------------------------------用分割线,就是这么自信---------------------------------------------------

下面说一下另一种扩展。很多时候,需要导出的表有多个甚至是全库,这时我一般会先用系统表查出表名,或在EXCEL中写入需要的全部表名,然后复制一下,再在CMD中粘贴,就可以实现多表的导入导出了。下面就贴出一段库中全表BCP导出的生成SQL,供大家参考:

SELECT 'BCP DB1.DBO.'+NAME+' OUT D:\'+NAME+'.dat -S SERVER1 -U sa -P sa -n'
,'TRUNCATE TABLE '+NAME
,'BCP DB2.DBO.'+NAME+' in D:\'+NAME+'.dat -S SERVER2 -U sa -P sa -n'
FROM SYS.TABLES
ORDER BY NAME

如果是用EXCEL,公式参考如下:

="BCP DB1.DBO." & A1 & " OUT D:\" & A1 & ".dat -S SERVER1 -U sa -P sa -n"

第一句复制到cmd中导出所有文件,复制文件到能库目标库的机器上,先用TRUNCATE在SSMS中运行清空SERVER2上的所有待导入表,再运行第二个BCP语句导入。我一直是这样做的,在结构一致的情况下,至今没出过问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该软件能把任意文件名,按照您事先设定的关键词随机重新组合,重新命名后变成新的不重复文件名,新文件名可上传到网络或网站及论坛被重复引用,达到宣传您产品的最后目的。该工具用于网络宣传可在三个方面得到应用:1,带有您产品宣传的图片批量换名上传到网络宣传您的产品。大家知道:在海量的网络文字信息资源中,图片展示的信息最吸引人的注意力,图片也能最直接表达您所展示的产品。使用该工具,您可把所需宣传的图片一两张图片也可以,经过重新命名后,变成成千上万张带有您所宣传关键字图片,上传到各大免费博客或图片网站,只要被搜索引擎搜录,您的产品就出现在网络上了。2,在网站文章和论坛发帖引用图片方面的应用。致力于网站建设的站长们或B2B信息平台或论坛及贴吧都离不开图片的引用,一个不换名的图片,是不会被搜索引擎重复收录的。如您的网站图片很多,利用该工具定期把经常引用的图片换换名,被搜索引擎重复搜录的可能性就多。利用该工具最大的好处是不用为图片标题关键字重组费脑筋。3,任意文件名批量换名上传到网盘、下载站宣传您的产品。该软件不是只用于图片换名,它可把任意后缀的文件换名。您可把软件、电子书、视频、歌曲、文档等文件,换成您所宣传产品的带有您关键字的文件名描述,让文件名的关键字覆盖您所宣传的领域,上传到网盘、各类下载站。最终达到宣传您产品的目的。欢迎您下载使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值