SQL Server的bcp命令


官网: https://docs.microsoft.com/zh-cn/sql/tools/bcp-utility?view=sql-server-2017



bcp  实用工具可以在 Microsoft SQL Server 实例和用户指定格式的数据文件间大容量复制数据。  使用  bcp  实用工具可以将大量新行导入 SQL Server 表,或将表数据导出到数据文件。   除非与  queryout  选项一起使用,否则使用该实用工具不需要了解 Transact-SQL 知识。   若要将数据导入表中,必须使用为该表创建的格式文件,或者必须了解表的结构以及对于该表中的列有效的数据类型。


BCP的所有参数:

 

BCP可以执行的4种操作

(1) 导入  
这个动作使用in命令完成,后面跟需要导入的文件名。 
(2) 导出  
这个动作使用out命令完成,后面跟需要导出的文件名。 
(3) 使用SQL语句导出  
这个动作使用queryout命令完成,它跟out类似,只是数据源不是表或视图名,而是SQL语句。 
(4) 导出格式文件  
这个动作使用format命令完成,后而跟格式文件名。

常用操作:

1. BCP 可信任连接到本地表导出:

用windows认证登陆并把text.dbo.name的表导出到D盘的 t_001.txt

2. BCP 可信任连接到导出查询

3. BCP 可信任连接连到远程服务器导出查询

也可以使用下面的T-SQL命令:

EXEC master..xp_cmdshell 'BCP  test.dbo.name out d:\t_002.txt -c -t -T'EXEC master..xp_cmdshell 'BCP  "select  name from test.dbo.name" queryout d:\t_004.txt -c -t -T'EXEC master..xp_cmdshell 'BCP tran_test.dbo.uptrans out d:\t_006.txt -c -t -S HOUYAJUN\JHIDCDBS005 -T'

在执行上述命令的时候可能会报错 : 错误提示:消息 15281,级别 16,状态 1,过程 xp_cmdshell,第 1 行

SQL Server 阻止了对组件 'xp_cmdshell' 的 过程 'sys.xp_cmdshell' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'xp_cmdshell'。有关启用 'xp_cmdshell' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。

这个时候需要我们来开启 :

-- 允许配置高级选项  EXEC master.sys.sp_configure 'show advanced options', 1  -- 重新配置  RECONFIGURE  -- 启用xp_cmdshell  EXEC master.sys.sp_configure 'xp_cmdshell', 1  --重新配置  RECONFIGURE

用完之后再把其关闭,关闭只需要把 1 变为 0 即可。
上面的语句也可以通过输入用户名和密码的形式出来,如下例句:

EXEC master..xp_cmdshell 'BCP  test.dbo.name out d:\t_008.txt -c -t  -U"sa" -P"ssssaaaa"'

4. BCP的导入 只需要把上面的 OUT 变为 in 就可以了。

EXEC master..xp_cmdshell 'BCP  test.dbo.name in d:\t_002.txt -c -t  -U -T'

这个是对刚才导出的数据进行重新的导入,可以很明显的看到表中的数据已经增加了。

 

常用参数:

-f format_file 
format_file表示格式文件名。这个选项依赖于上述的动作,如果使用的是in或out,format_file表示已经存在的格式文件,如果使用的是format则表示是要生成的格式文件。

-x 
这个选项要和-f format_file配合使用,以便生成xml格式的格式文件。

-F first_row 
指定从被导出表的哪一行导出,或从被导入文件的哪一行导入。

-L last_row 
指定被导出表要导到哪一行结束,或从被导入文件导数据时,导到哪一行结束。

-c 
使用char类型做为存储类型,没有前缀且以"\t"做为字段分割符,以"\n"做为行分割符。

-w 
和-c类似,只是当使用Unicode字符集拷贝数据时使用,且以nchar做为存储类型。

-t field_term 
指定字符分割符,默认是"\t"。

-r row_term 
指定行分割符,默认是"\n"。

-S server_name[ \instance_name] 
指定要连接的SQL Server服务器的实例,如果未指定此选项,BCP连接本机的SQL Server默认实例。如果要连接某台机器上的默认实例,只需要指定机器名即可。

-U login_id 
指定连接SQL Sever的用户名。

-P password 
指定连接SQL Server的用户名密码。

-T 
指定BCP使用信任连接登录SQL Server。如果未指定-T,必须指定-U和-P。

-k 
指定空列使用null值插入,而不是这列的默认值。

 





BCP 命令的参数很多,使用 -h 查看帮助信息,注意:参数是区分大小写的




使用BCP命令导出和导入数据常用的参数如下


bcp {[[database_name.][schema_name]].{table_name | view_name} | "query"}


{in | out | queryout}  数据文件


[-c 字符类型]  | [-w 宽字符类型]

[-t 字段终止符]    [-r 行终止符]

[-i 输入文件]       [-o 输出文件]        

[-S 服务器名称]   [-U 用户名]           [-P 密码]

[-T 可信连接]      [-d 数据库名称]

[-k 保留NULL值]


-c 使用char类型做为存储类型,没有前缀且以"\t"做为字段分割符,以"\n"做为行分割符。


-w 使用Unicode字符集拷贝数据,在数据库中,需要将Table Column设置为 nchar或nvarchar存储类型。如果 -c 和 -w 同时指定,那么 -w 将覆盖 -c。


-t field_term 指定column分割符,默认是"\t"。


-r row_term 指定row分割符,默认是"\n"。


-S server_name[ \instance_name] 指定要连接的SQL Server服务器的实例,如果未指定此选项,BCP连接本机的SQL Server默认实例。如果要连接某台机器上的默认实例,只需要指定机器名即可。


-U login_id 指定连接SQL Sever的用户名。


-P password 指定连接SQL Server的用户名密码。


-T 指定BCP使用信任连接登录SQL Server。如果未指定-T,必须指定-U和-P。


-d 指定数据库名称


-k 指定空列使用null值插入,而不是这列的默认值。


data_file
数据文件的完整路径。   将数据批量导入  SQL Server 时,数据文件将包含要复制到指定的表或视图中的数据。   从  SQL Server 中批量导出数据时,数据文件将包含从表或视图中复制的数据。   路径可以有 1 到 255 个字符。   数据文件最多可包含 2^63 - 1 行。

database_name
指定的表或视图所在数据库的名称。   如果未指定,则使用用户的默认数据库。

你也可以使用  d-  显式指定数据库名称。

in   data_file  |  out   data_file  |  queryout   data_file  |  format nul
指定大容量复制的方向,具体如下:

  • in  从文件复制到数据库表或视图。

  • out  从数据库表或视图复制到文件。   如果指定了现有文件,则该文件将被覆盖。   提取数据时,请注意  bcp  实用工具将空字符串表示为 null,而将 null 字符串表示为空字符串。

  • queryout  从查询中复制,仅当从查询大容量复制数据时才必须指定此选项。

  • format  根据指定的选项( -n 、  -c 、  -w 或  -N )以及表或视图的分隔符创建格式化文件。   大容量复制数据时,  bcp  命令可以引用一个格式化文件,从而避免以交互方式重复输入格式信息。   format  选项要求指定  -f  选项;创建 XML 格式化文件时还需要指定  -x  选项。   有关详细信息,请参阅  创建格式化文件 (SQL Server) 。   必须将  nul  指定为值 ( format nul )。

owner
表或视图的所有者的名称。   如果执行该操作的用户拥有指定的表或视图,则 owner  是可选的。   如果未指定  owner  ,并且执行该操作的用户不是指定的表或视图的所有者,则  SQL Server  将返回错误消息,而且该操作将取消。

"   query   "  是一个返回结果集的  Transact-SQL  查询。   如果该查询返回多个结果集,则只将第一个结果集复制到数据文件,而忽略其余的结果集。   将查询用双引号括起来,将查询中嵌入的任何内容用单引号括起来。   从查询大容量复制数据时,也必须指定 queryout  。

只要在执行 bcp 语句之前存储过程内引用的所有表均存在,查询就可以引用该存储过程。   例如,如果存储过程生成一个临时表,则  bcp  语句便会失败,因为该临时表只在运行时可用,而在语句执行时不可用。   在这种情况下,应考虑将存储过程的结果插入表中,然后使用  bcp  将数据从表复制到数据文件中。

table_name
将数据导入  SQL Server  ( in ) 时为目标表名称,将数据从  SQL Server  导出时 ( out ) 为源表名称。

view_name  
将数据复制到  SQL Server  ( in ) 时为目标视图名称,从  SQL Server  中复制数据时 ( out ) 为源视图名称。   只有其中所有列都引用同一个表的视图才能用作目标视图。   有关将数据复制到视图的限制的详细信息,请参阅 《INSERT (Transact-SQL)》

-a   packet_size
指定服务器发出或接收的每个网络数据包的字节数。   可以使用  SQL Server Management Studio  (或  sp_configure  系统存储过程)来设置服务器配置选项。   但是,可以使用此选项逐个替代服务器配置选项。 packet_size  的取值范围为 4096 到 65535 字节,默认为 4096 字节。

增大数据包可以提高大容量复制操作的性能。   如果无法得到请求的较大数据包,则使用默认值。   bcp  实用工具生成的性能统计信息可以显示所用的数据包大小。

-b   batch_size
指定每批导入数据的行数。   每个批次均作为一个单独的事务进行导入并记录,在提交之前会导入整批。   默认情况下,数据文件中的所有行均作为一个批次导入。   若要将行分为多个批次进行操作,请指定小于数据文件中的行数的  batch_size  。   如果任何批次的事务失败,则将只回滚当前批次中的插入。   已经由已提交事务导入的批次不会受到将来失败的影响。

不要将此选项与  -h "  ROWS_PER_BATCH  = bb "  选项一起使用。

-c
使用字符数据类型执行该操作。   此选项不提示输入每个字段;它使用  char  作为存储类型,没有前缀;使用  \t (制表符)作为字段分隔符,使用  \r\n  (换行符)作为行终止符。   -c  与  -w  不兼容。

有关详细信息,请参阅 使用字符格式导入或导出数据 (SQL Server)

-C  {  ACP  |  OEM  |  RAW  |  code_page  }  
指定该数据文件中数据的代码页。   仅当数据含有字符值大于 127 或小于 32 的 code_page  、  code_page varcode_page 列时,  code_page  columns with code_pageacter values greater than 127 or less than 32.

 备注

我们建议你为格式文件中的每个列指定一个排序规则名称,除非你希望 65001 选项优先于排序规则/代码页规范。

代码页值 描述
ACP ANSI /Microsoft Windows (ISO 1252)。
OEM 客户端使用的默认代码页。   未指定  -C  时使用的默认代码页。
RAW 不进行代码页间的转换。   因为不进行转换,所以这是最快的选项。
code_page 特定的代码页编号,例如 850。

低于 13 ( SQL Server 2016 (13.x) ) 的版本不支持代码页 65001(UTF-8 编码)。   版本 13 和后续版本可将 UTF-8 编码导入以前版本的  SQL Server 。

-d   database_name  
指定要连接到的数据库。   默认情况下,bcp.exe 连接到用户的默认数据库。   如果指定了  -d  database_name 和包含三部分的名称(database_name.schema.table,作为第一个参数传递给 bcp.exe),则将发生错误,因为不能两次指定数据库名称。如果 database_name 以连字符 (-) 或正斜杠 (/) 开头,则不会在  -d  和数据库名称之间添加空格。

-e   err_file
指定错误文件的完整路径,此文件用于存储  bcp  实用工具无法从文件传输到数据库的所有行。   bcp  命令产生的错误消息将被发送到用户的工作站。   如果不使用此选项,则不会创建错误文件。

如果  err_file  以连字符 (-) 或正斜杠 (/) 开头,则不要在  -e  与  err_file  值之间包含空格。

-E  
指定导入数据文件中的标识值用于标识列。   如果未指定  -E  ,则将忽略要导入的数据文件中此列的标识值,而且  SQL Server  将根据创建表期间指定的种子值和增量值自动分配唯一值。

如果数据文件不包含表或视图中的标识列的值,则可使用格式化文件指定,在导入数据时应跳过表或视图中的标识列; SQL Server  将自动为该列分配唯一值。   有关详细信息,请参阅  DBCC CHECKIDENT (Transact-SQL)

-E  选项有一个特殊的权限要求。   有关详细信息,请参阅本主题后面的“ 备注 ”。

-f   format_file
指定格式化文件的完整路径。   此选项的含义取决于使用它的环境,具体如下:

  • 如果  -f  与  format  选项一起使用,则将为指定的表或视图创建指定的  format_file  。   若要创建 XML 格式化文件,请同时指定  -x  选项。   有关详细信息,请参阅  创建格式化文件 (SQL Server)

  • 如果与  in  或  out  选项一起使用,则  -f  需要一个现有的格式化文件。

     备注

    与  in  或  out  选项一起使用时,格式化文件是可选的。   如果没有  -f  选项,则在未指定  -n 、  -c 、  -w 或 -  N  时,该命令将提示输入格式信息,并允许你将响应保存在格式化文件(默认文件名为 Bcp.fmt)中。

如果  format_file  以连字符 (-) 或正斜杠 (/) 开头,则不要在  -f  与  format_file  值之间包含空格。

-F   first_row
指定要从表中导出或从数据文件导入的第一行的编号。   此参数的值应大于 (>) 0,小于 (<) 或等于 (=) 总行数。 如果未指定此参数,则默认为文件的第一行。

first_row  可以是一个最大为 2^63-1 的正整数值。   -F  first_row 的值从 1 开始。

-G
当连接到 Azure SQL 数据库或 Azure SQL 数据仓库时,客户端将使用此开关指定该用户使用 Azure Active Directory 身份验证来进行身份验证。   -G 开关需要 14.0.3008.27 版本或更高版本 。   要确定你的版本,请执行 bcp -v。   有关详细信息,请参阅 使用 Azure Active Directory 身份验证进行身份验证与 SQL 数据库或 SQL 数据仓库

 重要

-G  选项仅适用于 Azure SQL 数据库 和 Azure 数据仓库。   在 Linux 或 macOS 上不当前支持 AAD 集成和交互式身份验证。

 提示

若要查看你的 bcp 版本是否包括对 Azure Active Directory 身份验证 (AAD) 类型的支持 bcp-  (bcp<空间 ><短划线 ><短划线 >),并验证您看到-G 在列表中可用参数。

  • Azure Active Directory 用户名和密码:

    当你想要使用 Azure Active Directory 用户名和密码时,可以提供  -G  选项,也可以通过提供  -U  选项和  -P 选项来使用用户名和密码。

    下面的示例将导出的数据使用 Azure AD 用户名和密码的用户和密码是一个 AAD 凭据。   该示例将导出表 bcptest 从数据库 testdb 从 Azure 服务器 aadserver.database.windows.net ,并将数据存储在文件中 c:\last\data1.dat :

    复制
    bcp bcptest out "c:\last\data1.dat" -c -t -S aadserver.database.windows.net -d testdb -G -U alice@aadtest.onmicrosoft.com -P xxxxx
    

    以下示例将导入数据使用 Azure AD 用户名和密码的用户和密码是一个 AAD 凭据。   该示例从文件导入数据 c:\last\data1.dat 到表 bcptest 数据库 testdb Azure 服务器上 aadserver.database.windows.net 使用 Azure AD 用户/密码:

    复制
    bcp bcptest in "c:\last\data1.dat" -c -t -S aadserver.database.windows.net -d testdb -G -U alice@aadtest.onmicrosoft.com -P xxxxx
    
  • Azure Active Directory 集成

    要进行 Azure Active Directory 集成身份验证,可提供 -G 选项而无需用户名或密码。   此配置假定当前 Windows 用户帐户 (帐户下运行 bcp 命令) 与 Azure AD 联合:

    下面的示例将使用 Azure AD 的集成的帐户的数据导出。   该示例将导出表 bcptest 从数据库 testdb 使用从 Azure 服务器的 Azure AD 集成 aadserver.database.windows.net ,并将数据存储在文件中 c:\last\data2.dat :

    复制
    bcp bcptest out "c:\last\data2.dat" -S aadserver.database.windows.net -d testdb -G -c -t
    

    以下示例将导入数据使用 Azure AD 集成身份验证。该示例从文件导入数据 c:\last\data2.txt 到表 bcptest 数据库 testdb Azure 服务器上 aadserver.database.windows.net 使用 Azure AD 集成身份验证:

    复制
    bcp bcptest in "c:\last\data2.dat" -S aadserver.database.windows.net -d testdb -G -c -t
    
  • Azure Active Directory 交互式身份验证

    交互式 Azure AD 身份验证用于 Azure SQL 数据库和 SQL 数据仓库,可以使用支持多重身份验证的交互式方法。   有关其他信息,请参阅 Active Directory 交互式身份验证

    交互式 azure AD 要求 bcp   版本 15.0.1000.34 或更高版本,以及 ODBC 版本 17.2 或更高版本

    若要启用交互式身份验证,请提供-G 选项与用户名 (-U),但不提供密码。

    下面的示例将使用 Azure AD 交互模式下,该值指示用户名的用户是指的 AAD 帐户的数据导出。   这是在上一节中使用的同一示例:  Azure Active Directory 用户名和密码

    交互模式要求提供密码才能手动输入,或者将启用,多重身份验证的帐户完成配置的 MFA 身份验证方法。

    复制
    bcp bcptest out "c:\last\data1.dat" -c -t -S aadserver.database.windows.net -d testdb -G -U alice@aadtest.onmicrosoft.com
    

    如果 Azure AD 用户是域联合一个使用 Windows 帐户,在命令行中,所需的用户名包含其域帐户 (例如,joe@contoso.com如下所示):

    复制
    bcp bcptest out "c:\last\data1.dat" -c -t -S aadserver.database.windows.net -d testdb -G -U joe@contoso.com
    

    如果来宾用户特定的 Azure AD 中存在并且具有数据库权限以执行 bcp 命令的 SQL DB 中存在的组的一部分,使用来宾用户是其别名 (例如, *keith0@adventureworks.com*)。

-h "load hints[ ,... n]"  指定向表或视图中批量导入数据时要用到的提示。

  • ORDER ( column [ASC | DESC] [ , ... n ])
    数据文件中的数据排序次序。   如果根据表中的聚集索引(如果有)对要导入的数据排序,则可提高批量导入的性能。   如果数据文件以不同的次序(即不同于聚集索引键的次序)排序,或者表中不存在任何聚集索引,则将忽略 ORDER 子句。   提供的列名必须是目标表中有效的列名。   默认情况下,  bcp  假定数据文件没有排序。   对于经过优化的批量导入,  SQL Server  还将验证导入的数据是否已排序。

  • ROWS_PER_BATCH   =   bb
    每批数据的行数(即  bb )。   在未指定  -b  时使用,这将导致整个数据文件作为单个事务发送到服务器。 服务器根据  bb 值优化大容量加载。   默认情况下,ROWS_PER_BATCH 是未知的。

  • KILOBYTES_PER_BATCH   =   cc
    每批的以千字节计数的近似数据量(即  cc )。   默认情况下,KILOBYTES_PER_BATCH 是未知的。

  • TABLOCK
    指定在大容量加载操作期间获取大容量更新表级别的锁;否则,获取行级别的锁。   由于在大容量复制操作期间拥有锁可以减少表中的锁争夺,所以此提示可显著提高性能。   如果表没有索引并且指定了  TABLOCK ,则该表可以同时由多个客户端加载。   默认情况下,锁定行为由表选项  table lock on bulk load 决定。

     备注

    如果目标表是聚集列存储索引,则多个并发客户端不需要 TABLOCK 提示就能加载,因为将在索引中为每个并发线程分配单独的行组,并在该行组中加载数据。   有关详细信息,请参阅列存储索引概念主题,

    CHECK_CONSTRAINTS
    指定在批量导入操作期间,必须检查所有对目标表或视图的约束。   如果没有 CHECK_CONSTRAINTS 提示,则忽略所有 CHECK 和 FOREIGN KEY 约束;操作完成后,对表的约束将被标记为不可信。

     备注

    始终强制使用 UNIQUE、PRIMARY KEY 和 NOT NULL 约束。

    在某些时候,需要检查整个表的约束。   如果在批量导入操作之前表为非空状态,则重新验证约束的开销可能超过将 CHECK 约束应用于增量数据的开销。   因此,建议您在正常情况下,在进行增量式批量导入时启用约束检查。

    当输入数据包含违反约束的行时,您可能希望禁用约束(默认行为)。   如果禁用 CHECK 约束,您可以导入数据,然后使用  Transact-SQL  语句删除无效数据。

     备注

    bcp  现在会强制执行数据验证和数据检查,这样,在对数据文件中的无效数据执行脚本时,可能会导致脚本失败。

     备注

    -m   max_errors  开关不适用于约束检查。

  • FIRE_TRIGGERS
    与  in  参数一同指定,在目标表中定义的任何插入触发器都将在大容量复制操作期间运行。   如果未指定 FIRE_TRIGGERS,将不运行任何插入触发器。   对于  out 、  queryout 和  format  参数,将忽略 FIRE_TRIGGERS。

-i   input_file
指定响应文件的名称,其中包含在交互模式(未指定  -n 、  -c 、  -w 或  -N  )下执行大容量复制时,对每个数据字段的命令提示问题所做出的响应。

如果  input_file  以连字符 (-) 或正斜杠 (/) 开头,则不要在  -i  与  input_file  值之间包含空格。

-k
指定在操作过程中空列应该保留 null 值,而不是所插入列的任何默认值。   有关详细信息,请参阅 在批量导入期间保留 Null 或使用默认值 (SQL Server)

-K   application_intent  
连接到服务器时声明应用程序工作负荷类型。   唯一可能的值是  ReadOnly 。   如果未指定  -K ,bcp 实用工具将不支持连接到 Always On 可用性组中的辅助副本。   有关详细信息,请参阅  活动辅助副本:可读辅助副本(AlwaysOn 可用性组) 概念。

-L   last_row
指定要从表中导出或从数据文件中导入的最后一行的编号。   此参数的值应大于 (>) 0,小于 (<) 或等于 (=) 最后一行的编号。   如果未指定此参数,则默认为文件的最后一行。

last_row  可以是一个最大为 2^63-1 的正整数值。

-m   max_errors
指定取消  bcp  操作之前可能出现的语法错误的最大数目。   语法错误是指将数据转换为目标数据类型时的错误。 max_errors  总数不包括只能在服务器中检测到的错误,如约束冲突。

无法由  bcp  实用工具复制的行将被忽略,并计为一个错误。   如果未包括此选项,则默认值为 10。

 备注

-m  选项也不适用于转换  money  或  bigint  数据类型。

-n
使用数据的本机(数据库)数据类型执行大容量复制操作。   此选项不提示输入每个字段,它将使用本机值。

有关详细信息,请参阅 使用本机格式导入或导出数据 (SQL Server)

-N
执行大容量复制操作时,对非字符数据使用本机(数据库)数据类型的数据,对字符数据使用 Unicode 字符。 此选项是  -w  选项的一个替代选项,并具有更高的性能。此选项主要用于通过数据文件将数据从  SQL Server  的一个实例传送到另一个实例。   此选项不提示输入每个字段。   如果要传送包含 ANSI 扩展字符的数据,并希望利用本机模式的性能优势,则可使用此选项。

有关详细信息信息,请参阅 使用 Unicode 本机格式导入或导出数据 (SQL Server)

通过使用 bcp.exe 和  -N  来导出数据后又将数据导入到同一表架构时,如果存在固定长度的非 Unicode 字符列(例如  char(10) ),系统可能会显示截断警告。

可忽略该警告。   解决此警告的一个方法是使用  -n  来替代  -N

-o   output_file
指定文件名称,该文件用于接收从命令提示符重定向来的输出。

如果  output_file  以连字符 (-) 或正斜杠 (/) 开头,则不要在  -o  与  output_file  值之间包含空格。

-P   password
指定登录 ID 的密码。   如果未使用此选项,  bcp  命令将提示输入密码。   如果在命令提示符的末尾使用此选项,但不提供密码,则  bcp  将使用默认密码 (NULL)。

 重要

不要使用空密码。   请使用强密码。

若要屏蔽密码,请不要指定  -P  选项和  -U  选项。   而应在指定  bcp  以及  -U  选项和其他开关(不指定  -P )之后按 Enter,这时命令会提示输入密码。   这种方法可以确保输入密码时对其屏蔽。

如果 password 以连字符 (-) 或正斜杠 (/) 开头,则不要在  -P  与 password 值之间添加空格。

-q
在  bcp  实用工具和  SQL Server 实例之间的连接中,执行 SET QUOTED_IDENTIFIERS ON 语句。   使用此选项可以指定包含空格或单引号的数据库、所有者、表或视图的名称。   将由三部分组成的整个表名或视图名用英文双引号 ("") 引起来。

必须使用 -q 选项,才能指定包含空格或单引号的数据库名称。

-q  不适用于传递到  -d 的值。

有关详细信息,请参阅本主题后面的  备注

-r   row_term
指定行终止符。   默认的行终止符是  \n  (换行符)。   使用此参数可替代默认行终止符。   有关详细信息,请参阅  指定字段终止符和行终止符 (SQL Server)

如果您在 bcp.exe 命令中以十六进制表示法指定行终止符,则该值将在 0x00 处截断。   例如,如果您指定 0x410041,则将使用 0x41。

如果  row_term  以连字符 (-) 或正斜杠 (/) 开头,则不要在  -r  与  row_term  值之间包含空格。

-R
指定使用客户端计算机区域设置中定义的区域格式,将货币、日期和时间数据大容量复制到  SQL Server  中。   默认情况下,将忽略区域设置。

-S server_name [\instance_name]  指定要连接的  SQL Server  的实例。   如果未指定服务器,则  bcp  实用工具将连接到本地计算机上的默认  SQL Server  实例。   如果从网络或本地命名实例上的远程计算机中运行  bcp  命令,则必须使用此选项。   若要连接到服务器上的  SQL Server  默认实例,请仅指定  server_name 。   要连接到  SQL Server 的命名实例,请指定 server_name\instance_name。

-t   field_term
指定字段终止符。   默认的字段终止符是  \t  (制表符)。   使用此参数可以替代默认字段终止符。   有关详细信息,请参阅  指定字段终止符和行终止符 (SQL Server)

如果您在 bcp.exe 命令中以十六进制表示法指定字段终止符,则该值将在 0x00 处截断。   例如,如果您指定 0x410041,则将使用 0x41。

如果  field_term  以连字符 (-) 或正斜杠 (/) 开头,则不要在  -t  与  field_term  值之间包含空格。

-T
指定  bcp  实用工具通过使用集成安全性的受信任连接连接到  SQL Server  。   不需要网络用户的安全凭据 login_id 和 password。   如果未指定  -T  ,则需要指定  -U  和  -P  才能成功登录。

 重要

如果  bcp  实用工具通过使用集成安全性的可信连接连接到  SQL Server ,则使用的是  -T  选项(可信连接),而不是用户名和密码的组合。   当  bcp  实用工具连接到 SQL 数据库或 SQL 数据仓库时,不支持使用 Windows 身份验证或 Azure Active Directory 身份验证。   使用  -U  和  -P  选项。

-U   login_id
指定用于连接到  SQL Server 的登录 ID。

 重要

如果  bcp  实用工具通过使用集成安全性的可信连接连接到  SQL Server ,则使用的是  -T  选项(可信连接),而不是用户名和密码的组合。   当  bcp  实用工具连接到 SQL 数据库或 SQL 数据仓库时,不支持使用 Windows 身份验证或 Azure Active Directory 身份验证。   使用  -U  和  -P  选项。

-v
报告  bcp  实用工具的版本号和版权信息。

-V  ( 80  |  90  |  100  |  110  |  120  |  130  )
使用  SQL Server 早期版本中的数据类型执行大容量复制操作。   此选项并不提示输入每个字段,它将使用默认值。

80  =  SQL Server 2000 (8.x)

90  =  SQL Server 2005

100  =  SQL Server 2008  和  SQL Server 2008 R2

110  =  SQL Server 2012 (11.x)

120  =  SQL Server 2014 (12.x)

130  =  SQL Server 2016 (13.x)

例如,若要为  SQL Server 2000 (8.x) 不支持、但是在较高版本的  SQL Server 中引入的类型生成数据,请使用 -V80 选项。

有关详细信息,请参阅  导入来自早期版本的 SQL Server 的本机格式数据和字符格式数据

-w
使用 Unicode 字符执行大容量复制操作。   此选项不提示输入每个字段;它使用  nchar  作为存储类型,不带前缀;使用  \t  (制表符)作为字段分隔符,使用  \n  (换行符)作为行终止符。   -w  与  -c  不兼容。

有关详细信息,请参阅  使用 Unicode 字符格式导入或导出数据 (SQL Server)

-x
结合使用  format  和  -f  format_file 选项,可生成基于 XML 的格式化文件,而不是默认的非 XML 格式化文件。 在导入或导出数据时,  -x  不起作用。   如果不与  format  和  -f  format_file 一起使用,则将生成错误。

备注

使用  bcp  工具时,将安装  Microsoft SQL Server 2017  13.0 客户端。   如果同时安装了  SQL Server 2017  和早期版本  SQL Server 的工具,你所使用的可能是早期版本的  bcp  客户端,而不是  bcp  13.0 客户端,具体情况取决于 PATH 环境变量的值。   此环境变量定义 Windows 用于搜索可执行文件的目录集。   若要确定当前所使用的版本,请在 Windows 命令提示符下运行  bcp /v  命令。   有关如何在 PATH 环境变量中设置命令路径的信息,请参阅 Windows 帮助。

bcp 实用工具还可以与  Microsoft SQL Server 2016 功能包 分开下载。   选择  ENU\x64\MsSqlCmdLnUtils.msi  或  ENU\x86\MsSqlCmdLnUtils.msi

只有当  SQL Server  工具和  SQL Server  Native Client 一起安装后,才支持 XML 格式化文件。

有关在何处查找或如何运行  bcp  实用工具的信息以及有关命令提示实用工具语法约定的信息,请参阅 《Command Prompt Utility Reference (Database Engine)》 (命令提示实用工具参考(数据库引擎))。

有关准备数据以进行批量导入或导出操作的信息,请参阅 准备用于批量导出或导入的数据 (SQL Server)

有关何时在事务日志中记录由批量导入执行的行插入操作的信息,请参阅  《Prerequisites for Minimal Logging in Bulk Import》 (批量导入的最小日志记录的先决条件)。




 


一,使用bcp 将整个table中的数据导出到txt或csv文档中


bcp db_study.dbo.sales out D:\test.txt -S . -U sa -P sa -t '\t' -w 


bcp db_study.dbo.sales out D:\test.csv -S . -U sa -P sa -t ',' -w 

二,使用 query statement 将查询结果导出到txt 或 csv文档中


1,配置SQL Server,允许运行 xp_cmdshell 命令



-- 允许配置高级选项  

EXEC master.sys.sp_configure 'show advanced options', 1  

-- 重新配置  

RECONFIGURE  

-- 启用xp_cmdshell  

EXEC master.sys.sp_configure 'xp_cmdshell', 1  

--重新配置  

RECONFIGURE


否则,SQL Server 会抛出错误信息


SQL Server 阻止了对组件“xp_cmdshell”的 过程“sys.xp_cmdshell”的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用“xp_cmdshell”。有关启用“xp_cmdshell”的详细信息,请搜索 SQL Server 联机丛书中的“xp_cmdshell”。


启用“xp_cmdshell” 被认为是不安全的,在使用完 “xp_cmdshell” 命令之后,使用以下script将其禁用。 



-- 允许配置高级选项  

EXEC master.sys.sp_configure 'show advanced options', 1  

-- 重新配置  

RECONFIGURE  

-- 禁用xp_cmdshell  

EXEC master.sys.sp_configure 'xp_cmdshell', 0

--重新配置  

RECONFIGURE


2,使用  xp_cmdshell 命令运行BCP命令,将数据导出


EXEC master..xp_cmdshell 'bcp "SELECT [Store] ,[Item] ,[Color] ,[Quantity] FROM [db_study].[dbo].[Inventory]" queryout D:\test.txt -S . -U sa -P sa -t "\t" -w '

EXEC master..xp_cmdshell 'bcp "SELECT [Store] ,[Item] ,[Color] ,[Quantity] FROM [db_study].[dbo].[Inventory]" queryout D:\test.csv -S . -U sa -P sa -t "," -w '


3,使用  xp_cmdshell 命令,也可以将整个Table的数据导出


EXEC master..xp_cmdshell 'bcp [db_study].[dbo].[Inventory] out D:\test.txt -S . -U sa -P sa -t "\t" -w '

EXEC master..xp_cmdshell 'bcp [db_study].[dbo].[Inventory] out D:\test.csv -S . -U sa -P sa -t "," -w '


三,将数据导入到SQL Server



CREATE TABLE [dbo].[Inventory_LoadIn]

(

    [Store] [nvarchar](2) NULL,

    [Item] [varchar](20) NULL,

    [Color] [varchar](10) NULL,

    [Quantity] [int] NULL

)


1,使用BCP,将txt文档中的数据导入到table [dbo].[Inventory_LoadIn] 中


bcp [db_study].[dbo].[Inventory_LoadIn] in D:\test.txt -S . -U sa -P sa -t "\t" -w 

bcp [db_study].[dbo].[Inventory_LoadIn] in D:\test.csv -S . -U sa -P sa -t "," -w 


2,使用xp_cmdshell 命令执行bcp,将数据导入到数据库table中


EXEC master..xp_cmdshell 'bcp [db_study].[dbo].[Inventory_LoadIn] in D:\test.txt -S . -U sa -P sa -t "\t" -w '

EXEC master..xp_cmdshell 'bcp [db_study].[dbo].[Inventory_LoadIn] in D:\test.csv -S . -U sa -P sa -t "," -w '









About Me

........................................................................................................................

● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除

● 本文在itpub( http://blog.itpub.net/26736162 )、博客园( http://www.cnblogs.com/lhrbest )和个人weixin公众号( xiaomaimiaolhr )上有同步更新

● 本文itpub地址: http://blog.itpub.net/26736162

● 本文博客园地址: http://www.cnblogs.com/lhrbest

● 本文pdf版、个人简介及小麦苗云盘地址: http://blog.itpub.net/26736162/viewspace-1624453/

● 数据库笔试面试题库及解答: http://blog.itpub.net/26736162/viewspace-2134706/

● DBA宝典今日头条号地址: http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826

........................................................................................................................

● QQ群号: 230161599 (满) 、618766405

● weixin群:可加我weixin,我拉大家进群,非诚勿扰

● 联系我请加QQ好友 646634621 ,注明添加缘由

● 于 2019-04-01 06:00 ~ 2019-04-30 24:00 在魔都完成

● 最新修改时间:2019-04-01 06:00 ~ 2019-04-30 24:00

● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

........................................................................................................................

小麦苗的微店 https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

小麦苗出版的数据库类丛书 http://blog.itpub.net/26736162/viewspace-2142121/

小麦苗OCP、OCM、高可用网络班 http://blog.itpub.net/26736162/viewspace-2148098/

小麦苗腾讯课堂主页 https://lhr.ke.qq.com/

........................................................................................................................

使用 weixin客户端 扫描下面的二维码来关注小麦苗的weixin公众号( xiaomaimiaolhr )及QQ群(DBA宝典)、添加小麦苗weixin, 学习最实用的数据库技术。

........................................................................................................................

欢迎与我联系

 

 



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26736162/viewspace-2642395/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26736162/viewspace-2642395/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值