【问题标题】:SQL Bulk Copy Utility adding Carriage Returns to JSON filesSQL 批量复制实用程序将回车添加到 JSON 文件
【发布时间】: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。

在 Notepad++ 中查看所有字符时的输出如下所示:

【问题讨论】:

  • 这是 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


【解决方案1】:

我们终于能够得到想要的输出。 我们一直在尝试将结果转换为 nvarchar(MAX),如下所示:

SELECT CAST(
            (SELECT ProductID 'ID', ProductCost 'Cost' 
             FROM products FOR JSON PATH, ROOT('feedProducts') 
            ) 
            AS NVARCHAR(MAX)) AS feedData

经过大量试验和错误后,我们直接加载到一个变量中,然后从我们的存储过程中返回该变量,如下所示:

DECLARE @txtResult NVARCHAR(MAX)
SET @txtResult = (
                  SELECT ProductID 'ID', ProductCost 'Cost' 
                  FROM products FOR JSON PATH, ROOT('feedProducts') 
                 )
SELECT @txtResult as feedData

当我们在下面调用 bcp 实用程序时,第二个过程有效,而第一个无效。

bcp "exec [DatabaseName].[dbo].[sprocName]" queryout "'+@outputFile+'" -T -w

第一个过程截断了我们的数据,并没有给我们一个完整的结果,而第二个过程给了我们整个返回,我们得到了我们一直在寻找的文件。

【讨论】:

    猜你喜欢
    • 2020-07-23
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多