SQL Server 2008 R2中不修改查询时如何通过BCP减小TXT导出文件体积
SQL Server 2008 R2 BCP 导出TXT体积优化方案
所有调整均无需删减导出列、无需为SELECT增加行筛选条件,仅通过BCP原生配置消除冗余输出即可实现缩容。
1. 消除字段输出的无意义占位字符
- 原逻辑默认会为定长类型字段(char、nchar等)补足类型定义长度的尾部空格,是文件体积虚高的核心诱因。通过加
-c参数显式指定字符输出格式,BCP会自动按字段实际值长度输出,不再为定长字段补全空格 - 修正列分隔符的冗余空格问题:将分隔符参数从
-t "|"调整为-t"|"(参数值和前导标识间不留空格),避免列值与分隔符之间插入无意义的半角空格 - 针对日期、数值类字段,可通过查询层的格式化转换优化输出长度:比如用
CONVERT(varchar(19), 日期字段, 120)格式化日期,去掉默认导出时毫秒位的冗余占位0、前后空格,不改变字段实际业务含义 - 如程序读取无强制要求Windows换行格式,可通过
-r"\n"显式指定换行符,消除默认输出时每一行末尾多占的\r字节,全量数据下可累计节省数MB空间
2. 调整输出编码降低单字符占用体积
- SQL Server 2008 R2实例的BCP在未显式指定格式参数时,默认会按UTF-16LE Unicode编码输出文本,单字符至少占2字节,是文件体积偏大的主要来源。通过上面提到的
-c参数强制切换为单字节字符输出模式,同等内容下体积可直接降低40%-50% - 配合
-C 936参数指定GBK代码页输出,确保中文、半角字符按标准编码存储,不会出现乱码,进一步避免Unicode编码带来的冗余字节开销 - 注意切勿混用
-w参数,该参数会强制启用Unicode输出,与缩容目标相悖
3. 修正嵌套转义导致的输出冗余
- 现有写法存在xp_cmdshell命令的嵌套双引号转义问题:外层整体命令被双引号包裹时,内部
-t "|"的双引号会提前截断命令字符串,导致BCP实际接收到的列分隔符为默认制表符,同时将|识别为独立参数,最终输出的列之间会夹杂大量空格、制表符,凭空增加冗余体积 - 调整后的可直接复用的参考命令:
EXECUTE master.dbo.xp_cmdshell 'BCP "SELECT Columns FROM table" queryout D:\OUTPUT\Filename.txt -S Servername -c -t"|" -T -C 936'
按以上配置调整后,同等列、同等数据量的前提下,20MB的导出文件通常可压缩至6-10MB区间,不会改动原有业务导出的字段完整性、数据覆盖范围。
内容的提问来源于stack exchange,提问作者Merka
相关产品推荐
相关产品推荐

