SQL Server json被截断(即使使用NVARCHAR(max)时)

时间:2018-06-28 15:51:28

标签: sql json sql-server

DECLARE @result NVARCHAR(max);

SET @result = (SELECT * FROM table
               FOR JSON AUTO, ROOT('Data'))

SELECT @result;

这将返回约43000个字符的json字符串,并且某些结果将被截断。

SET @result = (SELECT * FROM table
               FOR JSON AUTO, ROOT('Data'))

这将返回〜2000个字符的json字符串。有什么方法可以防止任何截断吗?甚至在处理一些大数据时,字符串还有成千上万个字符?

8 个答案:

答案 0 :(得分:3)

我没有找到“官方”答案,但似乎这与新的“ FOR JSON”语句错误,该语句将结果分成2033个字符长的行。 按照here的建议,到目前为止最好的选择是遍历连接返回行的结果:

const cheerio = require('cheerio');
const $ = cheerio.load(xmlText, { xmlMode: true });

function flipTextInPlace ($) {
    $('text').each(() => {
       const y = $(this).attr('y');
       $(this).attr('y', 940 - y);
    }).appendTo('svg');
}

顺便说一句,最新版本的SSMS似乎已经在应用这种解决方法,以便将结果显示在一行中。

答案 1 :(得分:2)

在SQL Server 2017(版本14.0.2027)中,我可以使用print而不是select来获取完整的,未截断的字符串:

DECLARE @result NVARCHAR(max);

SET @result = (SELECT * FROM table
           FOR JSON AUTO, ROOT('Data'))

PRINT @result;

另一种选择是下载并使用Azure Data Studio,我认为这是对SSMS的多平台重写(类似于将Visual Studio重写为VS Code的方式)。似乎可以像预期的那样吐出整个非截断的json字符串!

答案 2 :(得分:2)

我知道这是一个旧线程,但是通过将结果发送到XML变量,我已经成功解决了这个问题。使用XML变量的优点是,长度不是表示为字符长度,而是表示为内存中字符串的大小,可以在选项中进行更改。因此,布拉德·C的回应现在看起来像...

DECLARE @result XML
SET @result = (SELECT * FROM table
FOR JSON AUTO, ROOT('Data'))
SELECT @result

or...

PRINT @result;

答案 3 :(得分:2)

如果您插入临时表,这也将起作用-不显示不应用SSMS的截断。 如果需要计算多个值,可能会有用。

declare @json table (j nvarchar(max));
insert into @json select * from(select* from Table where Criteria1 for json auto)a(j)
insert into @json select * from(select* from Table where Criteria2 for json auto)a(j)
select * from @json

答案 4 :(得分:1)

我们已经在SSMS中看到了类似的问题,没有在2033年使用可变的SSMS截断。

使用变量时,当您使用nvarcahr(max)变量时,查询实际上可以正常运行,但会在查询结果视图中将输出截断为43697。

我测试过的一种可能的解决方案是使用BCP将查询结果输出到文件中:

bcp "DECLARE @result NVARCHAR(max); SET @result = (SELECT * FROM table FOR JSON AUTO, ROOT('Data')); SELECT @result as Result;" queryout "D:\tmp\exportOutput.txt" -S SQL_SERVER_NAME -T -w

See BCP docs for specifying server name\instance and authentication options

答案 5 :(得分:1)

这里是 JSON 截断的答案:

SQL 将 JSON 结果分成大小为 2k 的块(至少我的 SQL 2016 安装是这样),结果集中每一行的第一列中有一个块。要获得整个结果,您的客户端代码必须遍历结果集并连接每条记录的第一列。当您到达行的末尾时,瞧,您的整个 JSON 结果将被检索,未删减。

当我第一次遇到截断问题时,我感到很困惑,几年来一直认为 FOR JSON 是一个不严肃的特性,只适用于最小的数据集。我了解到我只需要从 FOR XML 文档中读取整个记录集,而实际上从未在 FOR JSON 文档中看到它提到。

答案 6 :(得分:0)

不发布数据就很难准确确定问题所在,但是当我尝试以JSON格式导出查询时遇到了类似的问题。对我有用的解决方案是转到查询/查询选项/结果/文本/将“每列中显示的最大字符数:”设置为8192(最大值AFAIK)。

这可能对您的第一个查询没有多大帮助,但可能会分解为较小的查询并成功执行。我希望您可以在更改该设置后有效地运行第二个查询。

答案 7 :(得分:0)

如果您的数据长度小于65535,那么您应该使用@dfundako的建议,该建议在第一篇文章中进行了评论:

  

尝试转到“工具”,“选项”,“查询结果”,“ SQL Server”,“将结果网格化”,并将非XML数据设置为最大数量(我认为65535)

在我的情况下,数据长度为21k个字符,因此在导出到网格后,我复制了该值,结果很好,没有被截断。对于那些数据量较大的用户来说,仍然无法解决问题。