(https://msdn.microsoft.com/zh-cn/library/ms162802.aspx) 官方文档
(http://www.cnblogs.com/phyllis/archive/2011/05/13/2045240.html)
bcp 实用工具可以在 Microsoft SQL Server 实例和用户指定格式的数据文件间大容量复制数据。使用 bcp 实用工具可以将大量新行导入 SQL Server 表,或将表数据导出到数据文件。
有很多产品,有一种叫freebcp
BCP是SQL Server中负责导入导出数据的一个命令行工具,它是基于DB-Library的,并且能以并行的方式高效地导入导出大批量的数据。BCP可以将数据库的表或视图直接导出,也能通过SELECT FROM语句对表或视图进行过滤后导出。在导入导出数据时,可以使用默认值或是使用一个格式文件将文件中的数据导入到数据库或将数据库中的数据导出到文件中。
BCP是SQL Server 2000和SQL Server 2005工具中的一部分,BCP在SQL Server 2000和在SQL Server 2005中的版本不一样,实现的方法也不一样。在SQL Server 2000中,它是通过ODBCBCP.DLL这个文件来实现的。但是在SQL Server 2005中,它是通过SNAC来实现的。
二、BCP的主要功能
(1) 导入。
这个动作使用in命令完成,后面跟需要导入的文件名。
(2) 导出。
这个动作使用out命令完成,后面跟需要导出的文件名。
(3) 使用SQL语句导出。
这个动作使用queryout命令完成,它跟out类似,只是数据源不是表或视图名,而是SQL语句。
(4) 导出格式文件。
这个动作使用format命令完成,后而跟格式文件名。
三、BCP的主要参数(SQL Server 2005)
· -m max_errors: 规定最大允许的可以操作出错的个数。缺省是10,也就是说,如果在bcp操作中,碰到一个错,如果还在允许出错个数范围内,它还会继续进行bcp操作。
· -f format_file: 给出格式文件.format_file表示格式文件名。这个选项依赖于上述的动作,如果使用的是in或out,format_file表示已经存在的格式文件,如果使用的是format则表示是要生成的格式文件。
· -e err_file: 保存错误文件
· -F: first_row: 指定从被导出表的哪一行导出,或从被导入文件的哪一行导入。
· -L: last_row: 指定被导出表要导到哪一行结束,或从被导入文件导数据时,导到哪一行结束。
· -b batch_size: 一个batch里面包括的行数,缺省值为1.也就是说一次搞定。
· -n: 使用native (database) 数据类型。
· -c:使用char类型做为存储类型,没有前缀且以"\t"做为字段分割符,以"\n"做为行分割符。
· -w: 把所有的数据当作unicode类型。和-c类似,只是当使用Unicode字符集拷贝数据时使用,且以nchar做为存储类型。
· -N: 使用native(database)数据类型for nocharacter数据,对于character数据,则用unicode型
· -V: 告诉bcp我要用更早版本的数据库
· -q: 执行以下SET QUOTED_IDENTIFIER ON.
· -C codepage 使用collation
· -t field_term 就是指明一个column的结束符号,指定字符分割符,默认是"\t"。
· -r row_term 就是指明一个row的结束符号,指定行分割符,默认是"\n"。
· -i input_file: 也就是response文件,这样下次操作的时候,就不用问同样问题了。
· -o output_file: 也就是用来重定向的。
· -a packet_size: 指明一个网络包的有多少个bytes
· -S serverName\instance_name :指定要连接的SQL Server服务器的实例,如果未指定此选项,BCP连接本机的SQL Server默认实例。如果要连接某台机器上的默认实例,只需要指定机器名即可。
· -U:指定连接SQL Sever的用户名。
· -P:指定连接SQL Server的用户名密码。
· -T: 使用信任连接,指定BCP使用信任连接登录SQL Server。如果未指定-T,必须指定-U和-P。
· -v: 注意是小写的,打印出bcp的版本号码
· -R: 制定reginoal 设置
· -k: 指定空列使用null值插入,而不是这列的默认值。
· -E: 说明我们关注identity, 不会由数据库自动生成column 值。
· -h: “hint” 提示: 告诉bcp数据已经是sort好了。(能够提高性能)
· -x: 这个选项要和-f format_file配合使用,以便生成xml格式的格式文件。
==========================================================================================
(http://blog.csdn.net/feixianxxx/article/details/4365576)
BCP是SQL Server中负责导入导出数据的一个命令行工具,它是基于DB-Library的,并且能以并行的方式高效地导入导出大批量的数据
BCP除了可以在控制台执行外,还可以通过调用SQL Server的一个系统存储过程xp_cmdshell以SQL语句的方式运行BCP。如:EXEC master..xp_cmdshell 'BCP NTS.dbo.T_User out c:/User.txt -c -U"sa" -P"password"'
1. 四个动作
01. 导入:这个动作使用IN命令完成,后面跟需要导入的文件名
02. 导出:这个动作使用OUT命令完成,后面跟需要导出的文件名,数据源是表或者视图
03. 使用SQL语句导出:这个动作使用QueryOut命令完成,跟OUT类似,数据源是SQL语句
04. 导出格式文件:这个动作使用Format命令完成,后而跟格式文件名
2. 常用的选项
01. -f Format_File
Format_File表示格式文件名。这个选项依赖于上述的动作,如果使用的是IN或OUT,Format_File表示已经存在的格式文件,如果使用的是Format则表示是要生成的格式文件
02. -x
这个选项要和-f Format_File配合使用,以便生成XML格式的格式文件
03. -F First_Row
指定从被导出表的哪一行导出,或从被导入文件的哪一行导入
04. -L last_Row
指定被导出表要导到哪一行结束,或从被导入文件导数据时,导到哪一行结束
05. -c
使用Char类型做为存储类型,没有前缀且以"/t"做为字段分割符,以"/n"做为行分割符
06. -w
和-c类似,只是当使用Unicode字符集拷贝数据时使用,且以nChar做为存储类型
07. -t Field_Term
指定字符分割符,默认是"/t"
08. -r Row_Term
指定行分割符,默认是"/n"
09. -S Server_Name[ /Instance_Name]
指定要连接的SQL Server服务器的实例,如果未指定此选项,BCP连接本机的SQL Server默认实例。如果要连接某台机器上的默认实例,只需要指定机器名即可
10. -U Login_ID
指定连接SQL Sever的用户名
11. -P Password
指定连接SQL Server的用户名密码
12. -T
指定BCP使用信任连接登录SQL Server。如果未指定-T,必须指定-U和-P
13. -k
指定空列使用NULL值插入,而不是这列的默认值
01. 导出整个表或视图
BCP NTS.dbo.T_User out c:/User.txt -c -U"sa" -P"password" --使用密码连接(用户名和密码需要加上双引号)
BCP NTS.dbo.T_User out c:/User.txt -c -T --使用信任连接
02. 导出SQL语句的目标数据
BCP "SELECT TOP 20 * FROM NTS.dbo.T_User" queryout c:/User.txt -c -U"sa" -P"password"
BCP "SELECT TOP 20 * FROM NTS.dbo.T_User" queryout c:/User.txt -F 10 -L 13 -c -U"sa" -P"password" --导出第10条到13条记录
03. 导出格式文件
BCP NTS.dbo.T_User format nul -f c:/User_format1.fmt -c -T --把表结构信息导出到User_format1.fmt中
BCP NTS.dbo.T_User format nul -f c:/User_format2.fmt -x -c -T --把表结构信息导出XML中
04. 导入数据
在导入数据时可以根据已经存在的格式文件将满足条件的记录导入到数据库中,不满足则不导入。如上述的格式文件中的第三个字段的字符长度是24,如果某个文本文件中的相应字段的长度超过24,则这条记录将不被导入到数据库中,其它满足条件的记录正常导入
BCP NTS.dbo.T_User in c:/User1.txt -c -T
BCP NTS.dbo.T_User in c:/User1.txt -c -F 10 -L 13 -T --导入时也可使用-F和-L选项来选择目标数据
BCP NTS.dbo.T_User in c:/User1.txt -F 10 -L 13 -c -f c:/User_format1.fmt -T --使用普通的格式文件
BCP NTS.dbo.T_User in c:/User1.txt -F 10 -L 13 -c -x -f c:/User_format2.fmt -T --使用XML格式的格式文件
05. 实际导出的例子
EXEC master..xp_cmdshell 'BCP SZC.dbo.T_User out c:/test1.csv -c -U"sa" -P"qwert1"' --使用密码连接
EXEC master..xp_cmdshell 'BCP SZC.dbo.T_User out c:/test1.csv -c -T' --使用信任连接
4. 其他方法导入导出数据
01. 导入数据
SELECT * INTO authors1
FROM OPENDATASOURCE('SQLOLEDB', 'Data Source=192.1.1.2; UserID=sa; Password=qwert1').pubs.dbo.authors
02. 导出数据
INSERT INTO OPENDATASOURCE('SQLOLEDB', 'Data Source=192.1.1.2; UserID=sa; Password=qwert1').test.dbo.authors
SELECT * FROM pubs.dbo.authors
INSERT INTO OPENDATASOURCE('MICROSOFT.JET.OLEDB.4.0','Text;DATABASE=c:/')[data#txt] SELECT * FROM text1
INSERT INTO OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Text;DATABASE=c:/', [data#txt]) SELECT * FROM text1
03. 导入Excel数据
SELECT * INTO excel FROM OPENDATASOURCE('MICROSOFT.JET.OLEDB.4.0', 'Excel 5.0;DATABASE=c:/book1.xls' )[Sheet1$]
04. 导入到Excel
INSERT INTO OPENDATASOURCE('MICROSOFT.JET.OLEDB.4.0', 'Excel 5.0;DATABASE=c:/book1.xls' )[Sheet1$] SELECT * FROM excel
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/htl258/archive/2009/04/14/4070668.aspx
以上出自转载
今天百度搜了很多关于BCP的东西 自己尝试了一下
我的环境:
MSSQL2008 计算机名字 Owner-PC
实例名:poofly (注意这里)
数据库 test 数据表 tb
我首先进行了TB表的整个导出
一开始按照网上说的写。。
结果出现需要密码。纳闷了 我是windows身份验证 怎么要密码了。
后来找到了windows 身份的代码
exec master..xp_cmdshell 'bcp csdn_test..ta out c:/d.txt -c -S. -T'
(-T 使用网络用户的安全凭据,通过信任连接连接到 SQL Server)
出现下面错误:
output
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQLState = 37000, NativeError = 4060
Error = [Microsoft][ODBC SQL Server Driver][SQL Server]无法打开登录 'csdn_test' 中请求的数据库。登录失败。
NULL
纳闷阿。。
之后到论坛去问了 知道问题了
我原来机器上装过了SQL2000现在还没删呢 所有有2个数据库 要这样解决
-S 计算机名/实例名
或者
-S IP/实例名
整合起来就是
exec master..xp_cmdshell 'bcp test.dbo.tb out c:/d.txt -c -S Owner-PC/POOFLY -T'
NULL
开始复制...
NULL
已复制了 5 行。
数据包的大小(字节): 4096
时钟时间(毫秒): 共 1
NULL
(7 行受影响)
问题解决了 哈哈 这里问题关键就在于
一台机器上只有一个实例名 所以我就找到了现在的2008实例名
如何找实例名呢
看你用SQL Server Management Studio是怎么登录SQL2008实例的,那个服务器名称一杠后面就是实例名.
OK。。。
接下来我们进行 对要导出的表进行过滤 就是说 我不导出整个表或者试图 只取一部分
exec master..xp_cmdshell 'bcp "select top 2 * from test.dbo.tb" queryout c:/d.txt -c -S Owner-PC/POOFLY -T'
这里区别就是由一句select 语句加queryout 其他都一样了
具体格式大家去看上面
就写到这吧。。第一次写 呵呵 希望能够帮助你O(∩_∩)O
PS:如果出现
消息 15281,级别 16,状态 1,过程 xp_cmdshell,第 1 行
SQL Server 阻止了对组件 'xp_cmdshell' 的 过程 'sys.xp_cmdshell' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'xp_cmdshell'。有关启用 'xp_cmdshell' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。
那是因为你没开启'xp_cmdshell' 服务: 下面为开启方法 :运行下面代码即可
--MSsql2005如何启用xp_cmdshell
--默认情况下,sql server2005安装完后,xp_cmdshell是禁用的(可能是安全考虑),如果要使用它,可按以下步骤
-- 允许配置高级选项
EXEC sp_configure 'show advanced options', 1
GO
-- 重新配置
RECONFIGURE
GO
-- 启用xp_cmdshell
EXEC sp_configure 'xp_cmdshell', 1
GO
--重新配置
RECONFIGURE
GO
--执行想要的xp_cmdshell语句
Exec xp_cmdshell 'query user'
GO
--用完后,要记得将xp_cmdshell禁用(出于安全考虑)
-- 允许配置高级选项
EXEC sp_configure 'show advanced options', 1
GO
-- 重新配置
RECONFIGURE
GO
-- 禁用xp_cmdshell
EXEC sp_configure 'xp_cmdshell', 0
GO
--重新配置
RECONFIGURE
GO
==========================================================================
(http://www.cnblogs.com/qanholas/archive/2011/07/05/2098616.html)
用法: bcp {dbtable | query} {in | out | queryout | format} 数据文件
[-m 最大错误数] [-f 格式化文件] [-e 错误文件]
[-F 首行] [-L 末行] [-b 批大小]
[-n 本机类型] [-c 字符类型] [-w 宽字符类型]
[-N 将非文本保持为本机类型] [-V 文件格式版本] [-q 带引号的标识符]
[-C 代码页说明符] [-t 字段终止符] [-r 行终止符]
[-i 输入文件] [-o 输出文件] [-a 数据包大小]
[-S 服务器名称] [-U 用户名] [-P 密码]
[-T 可信连接] [-v 版本] [-R 允许使用区域设置]
[-k 保留空值] [-E 保留标识值]
[-h"加载提示"] [-x 生成xml 格式化文件]
--不利用格式化文件的导入导出(以下示例皆省略了-S参数,因为是在本机,又是默认实例)
--简单导出表
exec master..xp_cmdshell 'bcp db_oa.dbo.T_User_list out c:\a.xls -c -T' --"-T"信任连接
exec master..xp_cmdshell 'bcp db_oa.dbo.T_User_list out c:\a.txt -c -Usa -Pxxxxx'
--过滤导出表
exec master..xp_cmdshell 'bcp "select top 3 * from db_oa.dbo.t_user_list" queryout c:\a.txt -c -T'
--简单导入表
exec master..xp_cmdshell 'bcp db_oa.dbo.T_User_list_2 in c:\a.txt -c -T'
exec master..xp_cmdshell 'bcp db_oa.dbo.T_User_list_2 in c:\a.txt -c -T -E' --加上"-E"启用identity_insert on
--下面是利用XML格式化文件进行数据的导入!
--创建测试表
USE db_oa;
GO
CREATE TABLE myTestFormatFiles (
Col1 smallint,
Col2 nvarchar(50),
Col3 nvarchar(50),
Col4 nvarchar(50)
);
GO
--输出XML格式化文件
--说明一下:-t","是指定字段分隔符,稍后我们会讲到
exec master..xp_cmdshell 'bcp db_oa..MyTestFormatFiles format nul -c -t"," -x -f c:\myTestFormatFiles.Xml -T'
/*
格式化后的文件内容如下:
<?xml version="1.0"?>
< BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="7"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="100" COLLATION="Chinese_PRC_CI_AS"/>
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="100" COLLATION="Chinese_PRC_CI_AS"/>
<FIELD ID="4" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="100" COLLATION="Chinese_PRC_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="Col1" xsi:type="SQLSMALLINT"/>
<COLUMN SOURCE="2" NAME="Col2" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="3" NAME="Col3" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="4" NAME="Col4" xsi:type="SQLNVARCHAR"/>
</ROW>
< /BCPFORMAT>
这里我们对文件关键字稍作解释:
<RECORD>父节点中的内容是对源文件的格式化定义,即你要导入的数据文件
<FIELD ID="1"(这里是源数据字段ID) xsi:type="CharTerm"(字段类型) TERMINATOR=","(字段分隔符) MAX_LENGTH="7"(最大长度)/>
不难看出,我们最常修改的就是TERMINATOR,可以修改为"|"等你需要的分隔符,注意最后一个字段的分隔符为"\r\n"
</RECORD>
<ROW>该父节点的内容是目标数据的格式化定义,即你需要导入数据文件的地方
<COLUMN SOURCE="1"(这个非常重要,指定的是上面源数据的字段ID,当源数据和目标数据字段顺序或数目不一致时,我们可以修改这里达到我们想要的结果) NAME="Col1"(目标字段名称) xsi:type="SQLSMALLINT"(目标字段类型)/>
</ROW>
*/
--下面我们创建源数据文件,将以下内容粘贴到我们指定的数据文件C:\myTestFormatFiles-c.txt中
/*
10,Field2,Field3,Field4
15,Field2,Field3,Field4
46,Field2,Field3,Field4
58,Field2,Field3,Field4
*/
--利用bcp格式化文件导入数据
exec master..xp_cmdshell 'bcp db_oa..myTestFormatFiles in C:\myTestFormatFiles-c.txt -f C:\myTestFormatFiles.Xml -T'
--查看一下导入的数据
select * from myTestFormatFiles
/*
Col1 Col2 Col3 Col4
10 Field2 Field3 Field4
15 Field2 Field3 Field4
46 Field2 Field3 Field4
58 Field2 Field3 Field4
*/
--使用BULK INSERT导入数据
USE db_oa;
GO
DELETE myTestFormatFiles;
GO
BULK INSERT myTestFormatFiles
FROM 'C:\myTestFormatFiles-c.txt'
WITH (FORMATFILE = 'C:\myTestFormatFiles.Xml');
GO
SELECT * FROM myTestFormatFiles;
GO
/*
Col1 Col2 Col3 Col4
10 Field2 Field3 Field4
15 Field2 Field3 Field4
46 Field2 Field3 Field4
58 Field2 Field3 Field4
*/
--使用OPENROWSET 大容量行集提供程序导入
USE db_oa;
DELETE myTestFormatFiles;
GO
INSERT INTO myTestFormatFiles
SELECT *
FROM OPENROWSET(BULK 'C:\myTestFormatFiles-c.txt',
FORMATFILE='C:\myTestFormatFiles.Xml'
) as t1 ;
GO
SELECT * FROM myTestFormatFiles;
GO
/*
Col1 Col2 Col3 Col4
10 Field2 Field3 Field4
15 Field2 Field3 Field4
46 Field2 Field3 Field4
58 Field2 Field3 Field4
*/
--删除测试表
DROP TABLE myTestFormatFiles