You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:45:03