【发布时间】:2021-11-21 17:24:14
【问题描述】:
我们正在使用 SQL bcp 调用将数据从存储过程写入 JSON 文件。当我运行它并打开该文件时,添加了 CRLF 并将其分成几行。这会导致验证出现问题,如果您尝试使用 Notepad++ 或 JSON Buddy 进行格式化,则会引发解析错误。
set @cmd = 'bcp "exec [OurServer].[dbo].[sp_OurStoredProcedure]" queryout "'+@outputFile+'" -UTF8 -T'
exec master..xp_cmdshell @cmd
存储过程在我的 SELECT 语句末尾使用 FOR JSON PATH 将我的结果解析为 JSON。
【问题讨论】:
-
这是 JSON 流回客户端的时间 - 作为单独的行。我认为
bcp不够聪明,无法弥补。特别是,虽然您可以使用-r配置行终止符,但您不能将其配置为完全不存在(我认为,尽管-r ''值得一试)。 -
有一个修复(转换为
nvarchar(max)),如果您可以显示您的程序代码,我们可以告诉您如何操作。请告诉为什么您使用xp_cmdshell执行,这很危险,如果您需要批处理然后使用批处理cmd 或Powershell。 SQL 不是通用的脚本语言 -
我发现了 CAST 解决方法。它奏效了,我认为我已经解决了这个问题。但是,然后我在我们的完整数据集上运行它,它正在切断数据集。我认为 varchar(max) 可能高达 2TB,而这只有大约 115MB 的数据。知道为什么会这样切断吗?
-
SELECT CAST(( SELECT ProductID 'ID', ProductCost 'Cost' FROM products FOR JSON PATH, ROOT('feedProducts') ) AS VARCHAR(MAX)) AS XmlData
-
在2022540个字符后切断
标签: json sql-server tsql bcp