官方文档https://docs.microsoft.com/zh-cn/sql/tools/bcp-utility?view=sql-server-2017
SET OUT_SQLSERVER=-S 192.168.132.63 -U sa -P sccs123
bcp FDC.DBO.tb_First_Five_QC out tb_First_Five_QC.txt -w -k -C 65001 %OUT_SQLSERVER%
以上如果把脚本存成文件名bcp.bat或没有-c或-w,则运行的时候一直刷屏这两行数据。却压根不执行,因为存成文件名bcp.bat与真实的bcp命令相冲突,只要改成其他名字如bcp1.bat并加上-c或-w
-C后面指定字符集,如65001表示UTF-8
-w是单独存在且必须存在的,不是说-w后面就是接%变量%,一般使用-w,较少用-c
-F 后面接数字指定从被导出表的哪一行导出,或从被导入文件的哪一行导入
-L 后面接数字
指定被导出表要导到哪一行结束,或从被导入文件导数据时,导到哪一行结束
-c
使用Char类型做为存储类型,没有前缀且以"\t"做为字段分割符,以"\n"做为行分割符
-w
和-c类似,只是当使用Unicode字符集拷贝数据时使用,且以nChar做为存储类型
-b 后面接数字
表示bcp in导入时,每多少行就提交
指定每批导入数据的行数。 每个批次均作为一个单独的事务进行导入并记录,在提交之前会导入整批。 默认情况下,数据文件中的所有行均作为一个批次导入。 若要将行分为多个批次进行操作,请指定小于数据文件中的行数的 batch_size 。 如果任何批次的事务失败,则将只回滚当前批次中的插入。 已经由已提交事务导入的批次不会受到将来失败的影响。
实验经历:1亿行的表,表容量是200GB,每1万行就提交,bcp in时该数据库的恢复模式是full,没有其他任何会话,只有这个一个bcp in的会话,导入5千万行时,该数据库日志已经达到260GB了且不可收缩。这里要理解一个问题,这个日志的增大和-b提交与否无关,因为日志Full模式的旧称叫”Checkpoint without truncate log“,也就是SQL Server的Checkpoint不主动截断log,只有备份log之后,才可以截断log,否则log文件会一直增大,直到撑爆硬盘
-n
使用数据的本机(数据库)数据类型执行大容量复制操作。 此选项不提示输入每个字段,它将使用本机值。
-N
执行大容量复制操作时,对非字符数据使用本机(数据库)数据类型的数据,对字符数据使用 Unicode 字符。 此选项是 -w 选项的一个替代选项,并具有更高的性能。此选项主要用于通过数据文件将数据从 SQL Server 的一个实例传送到另一个实例。 此选项不提示输入每个字段。 如果要传送包含 ANSI 扩展字符的数据,并希望利用本机模式的性能优势,则可使用此选项。
通过使用 bcp.exe 和 -N来导出数据后又将数据导入到同一表架构时,如果存在固定长度的非 Unicode 字符列(例如 char(10) ),系统可能会显示截断警告。
解决此警告的一个方法是使用 -n 来替代 -N。
(管理员/用户)应尽可能使用本机格式 (-n) 以避免分隔符问题。 使用本机格式可以使用 SQL Server进行导出和导入。 如果数据将导入到非 SQL Server 数据库,则使用 -c 或 -w 选项从SQL Server 导出数据。
如果实例名称带了斜杠,比如select @@servername,SERVERPROPERTY(‘machinename’)显示为wodb\prod和DBPROD1,则-S时不能使用wodb\prod而要使用DBPROD1\prod或localhost\prod,因为-S [server_name[\instance_name]
bcp "select * from RayHistory.dbo.RAY_FinalEpsFCHistory where KaTeX parse error: Undefined control sequence: \BCP at position 46: …=1" queryout L:\̲B̲C̲P̲\RAY_FinalEpsFC…PARTITION.FNDate’
解决方法:分区表需要在分区前面加上数据库名称
替换
P
A
R
T
I
T
I
O
N
.
F
N
D
a
t
e
(
S
n
a
p
s
h
o
t
D
a
t
e
)
为
R
a
y
H
i
s
t
o
r
y
.
PARTITION.FNDate(SnapshotDate)为RayHistory.
PARTITION.FNDate(SnapshotDate)为RayHistory.PARTITION.FNDate(SnapshotDate)