SQL Server - “for json path”语句返回的 JSON 字符串不超过 2984 行

Bri*_* SP 7 sql json sql-server-2016 json-query for-json

我正在尝试使用“for json path”语句在复杂且嵌套的 JSON 字符串中生成大量数据,并且我使用多个函数来创建此 JSON 字符串的不同部分,如下所示:

declare @queue nvarchar(max)

select @queue = (
    select x.ID as layoutID
        , l.Title as layoutName
        , JSON_QUERY(queue_objects (@productID, x.ID)) as [objects]
    from Layouts x
    inner join LayoutLanguages l on l.LayoutID = x.ID
    where x.ID = @layoutid
    group by x.ID, l.Title
    for json path
)

select @queue as JSON
Run Code Online (Sandbox Code Playgroud)

到目前为止,JSON 将是:

{
    "root": [{
        "layouts": [{
            "layoutID": 5
            , "layoutName": "foo"
            , "objects": []
        }]
    }]
}
Run Code Online (Sandbox Code Playgroud)

然后将调用“queue_objects”函数来填充“objects”数组:

队列对象

select 0 as objectID
    , case when (select inherited_counter(@layoutID,0)) > 0 then 'false' else 'true' end as editable
    , JSON_QUERY(queue_properties (p.Table2ID)) as propertyObjects
    , JSON_QUERY('[]') as inherited
from productList p
where p.Table1ID = @productID
group by p.Table2ID 
for json path
Run Code Online (Sandbox Code Playgroud)

那么 JSON 将是:

{
    "root": [{
        "layouts": [{
            "layoutID": 5
            , "layoutName": "foo"
            , "objects": [{
                "objectID": 1000
                , "editable": "true"
                , "propertyObjects": []
                , "inherited": []
            }, {
                "objectID": 2000
                , "editable": "false"
                , "propertyObjects": []
                , "inherited": []
            }]
        }]
    }]
}
Run Code Online (Sandbox Code Playgroud)

还将调用“inherited_counter”和“queue_properties”函数来填充相应的键。

这只是一个示例,代码将无法工作,因为我没有将函数放在这里。
但我的问题是:是否是同时互相调用的函数导致服务器返回损坏的 JSON 字符串?或者是服务器本身无法处理超过 2984 行的 JSON 字符串?

编辑:我所说的2984行的意思是,我在JSON上使用美化器,服务器不会逐行返回字符串,它返回损坏的JSON,但美化后它恰好是2984行字符串。

小智 5

正如我在对 OP 的评论中所写,这可能是由于 SSMS 对结果网格中的列中显示的字符数有限制。它对实际结果没有影响,例如结果有所有数据,只是SSMS没有显示全部。

要解决此问题,您可以增加 SSMS 检索的字符数:

SSMS显示结果

我不会建议 - “一段字符串有多长”,而是将结果选择到一个nvarchar(max)变量中,然后选择PRINT该变量。这应该会给你全文。

希望这可以帮助!