为何BULK INSERT不再支持正则风格换行符,仅支持十六进制风格?
SQL Server 2022 CU10中ROWTERMINATOR必须用0x0d0x0a的问题解析
核心原因
- 新版本解析逻辑收紧:SQL Server 2022 CU10对BULK INSERT/OPENROWSET这类导入操作的换行符解析做了隐性调整。之前版本对纯LF(0x0a)的兼容性更强,哪怕文件里是CRLF(0x0d0x0a),指定0x0a也能正常分割行;但现在必须严格匹配文件实际的换行符二进制值,否则会把CR(0x0d)当成数据的一部分,导致导入出错。
- Notepad++的视觉误导:Notepad++会自动识别并统一显示不同换行符,但它不会改变文件的实际二进制内容。你看到的“Windows或Linux风格”可能只是显示效果,实际文件可能是CRLF格式,或者被其他工具修改时偷偷加了CR字符。
验证与解决方法
- 查文件真实二进制内容:
用十六进制编辑器打开文件,直接看每行结尾的二进制值:- 纯Linux换行:
0x0a - Windows换行:
0x0d0x0a
- 纯Linux换行:
- 严格匹配ROWTERMINATOR:
- 如果文件确实是纯LF,就指定
ROWTERMINATOR = '0x0a',同时检查是否有其他工具(比如编辑器、传输工具)自动给文件加了CR。 - 如果文件是CRLF,必须指定
ROWTERMINATOR = '0x0d0x0a',不然导入后每行数据末尾会多出一个\r字符,甚至导致行分割错误。
- 如果文件确实是纯LF,就指定
- 排查CU更新影响:
官方文档可能没明确写这个变更,但部分CU更新会修复之前的宽松解析逻辑,现在要求严格匹配换行符。可以找一台没打CU10的2022环境测试,就能确认是不是CU导致的变化。
补充说明
你提到的正则风格换行符:\r对应0x0d(回车)、\n对应0x0a(换行)、\r\n对应0x0d0x0a(Windows换行),在SQL Server导入场景里,必须和文件实际的二进制换行符完全对应,差一个都不行。
内容的提问来源于stack exchange,提问作者meteorainer
相关产品推荐
相关产品推荐

