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

jay*_*y93 4 sql sql-server json

DECLARE @result NVARCHAR(max);

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

SELECT @result;
Run Code Online (Sandbox Code Playgroud)

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

SET @result = (SELECT * FROM table
               FOR JSON AUTO, ROOT('Data'))
Run Code Online (Sandbox Code Playgroud)

这将返回约2000个字符的json字符串。有什么方法可以防止任何截断吗?即使在处理一些大数据时,字符串也有数百万个字符?

Tor*_*Tor 13

避免截断的最简单的解决方法是将查询包装在另一个选择中:

select (
     <your query> FOR JSON PATH [or FOR JSON AUTO]
) as json
Run Code Online (Sandbox Code Playgroud)


Bra*_*d C 9

我能够通过使用print而不是select在 SQL Server 2017(版本 14.0.2027)中获取完整的、未截断的字符串:

DECLARE @result NVARCHAR(max);

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

PRINT @result;
Run Code Online (Sandbox Code Playgroud)

另一种选择是下载并使用Azure Data Studio,我认为它是 SSMS 的多平台重写(类似于 Visual Studio 被重写为 VS Code 的方式)。它似乎按预期吐出了整个、未截断的 json 字符串!


小智 6

我没有找到“官方”答案,但是似乎这与新的“ FOR JSON”语句错误,该语句将结果分成2033个字符长的行。作为推荐这里迄今为止最好的选择是通过迭代的结果串接返回的行:

string result = "";
while (reader.Read())
{
    result += Convert.ToString(reader[0]);                        
}
Run Code Online (Sandbox Code Playgroud)

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

  • tbh,连接这样的字符串非常消耗资源。最好使用文档中指定的 StringBuilder 。 (2认同)

小智 6

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

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

or...

PRINT @result;
Run Code Online (Sandbox Code Playgroud)


Bar*_* G. 6

如果您插入临时表,这也将起作用 - 不呈现不会应用 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
Run Code Online (Sandbox Code Playgroud)


Mar*_*rkP 5

以下是 JSON 截断的答案:

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

当我第一次遇到截断问题时,我感到很困惑,并在几年内放弃了FOR JSON ,因为它是一个只适合最小数据集的不严肃的功能。我了解到我只需要从FOR XML文档中读取整个记录集,而实际上从未在FOR JSON文档中看到过它。

  • 好的,当然...您将如何读取 SSMS 等内容中的整个记录​​集?从来没有听说过... (4认同)

Pau*_*use 2

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

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