使用SQL Bulk Copy Utility导出JSON时新增CRLF导致解析错误
bcp导出JSON文件自动插入CRLF导致校验失败解决方案
问题表现
使用SQL bcp命令导出存储过程的执行结果为JSON文件时,生成的文件会被自动添加CRLF(回车换行符)拆分为多行,直接导致JSON校验失败,使用Notepad++、JSON Buddy等工具对文件做格式化操作时会抛出解析错误。
相关代码
执行的bcp导出命令如下:
set @cmd = 'bcp "exec [OurServer].[dbo].[sp_OurStoredProcedure]" queryout "'+@outputFile+'" -UTF8 -T' exec master..xp_cmdshell @cmd
对应的存储逻辑是在SELECT语句末尾使用FOR JSON PATH将查询结果格式化为JSON格式输出。
导出后的文件开启Notepad++显示所有字符功能后的效果如下:
修复方案
- 方案1:修改bcp命令参数
bcp默认会为输出内容添加CRLF作为行终止符,显式指定-r参数设置行终止符为空即可取消自动插入换行:
set @cmd = 'bcp "exec [OurServer].[dbo].[sp_OurStoredProcedure]" queryout "'+@outputFile+'" -UTF8 -T -r ""' exec master..xp_cmdshell @cmd
- 方案2:处理长JSON拆分问题
如果JSON内容长度超过8000字符,SQL Server默认会将FOR JSON的输出拆分为多行、每行2033字符返回,需要调整存储过程逻辑,先将JSON结果存入NVARCHAR(MAX)类型变量再输出:
DECLARE @jsonOutput NVARCHAR(MAX) -- 原FOR JSON查询逻辑赋值给变量 SET @jsonOutput = (SELECT 字段1, 字段2 FROM 业务表 FOR JSON PATH) -- 统一输出完整JSON SELECT @jsonOutput
- 方案3:后置处理移除换行
如果不方便调整导出逻辑,可以通过PowerShell命令直接清理导出文件中的多余换行:
(Get-Content "目标JSON文件路径" -Raw).Replace("`r`n", "") | Set-Content "目标JSON文件路径" -Force -Encoding UTF8
原因说明
该问题由两个特性共同导致:一是bcp工具默认的行终止符为CRLF,输出时会自动追加;二是SQL Server原生FOR JSON返回长字符串时会自动按2033字符拆分多行,两者都会破坏JSON的单行结构,导致校验失败。
内容的提问来源于stack exchange,提问作者LarryG
相关产品推荐
相关产品推荐

