SQL 服务器 - "for json path" 语句不 return 超过 2984 行 JSON 字符串
SQL Server - "for json path" statement does not return more than 2984 lines of JSON string
我正在尝试使用“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
到目前为止,JSON 将是:
{
"root": [{
"layouts": [{
"layoutID": 5
, "layoutName": "foo"
, "objects": []
}]
}]
}
然后将调用“queue_objects”函数来填充 'objects' 数组:
queue_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
然后 JSON 将是:
{
"root": [{
"layouts": [{
"layoutID": 5
, "layoutName": "foo"
, "objects": [{
"objectID": 1000
, "editable": "true"
, "propertyObjects": []
, "inherited": []
}, {
"objectID": 2000
, "editable": "false"
, "propertyObjects": []
, "inherited": []
}]
}]
}]
}
也会调用“inherited_counter”和“queue_properties”函数来填充相应的键。
这只是一个示例,代码将无法运行,因为我没有在此处放置函数。
但我的问题是:是同时调用彼此的函数,使服务器 return 损坏 JSON 字符串吗?还是服务器本身无法处理 JSON 超过 2984 行的字符串?
编辑:我所说的 2984 行的意思是,我在 JSON 上使用美化器,服务器不会逐行 return 字符串,它 returns JSON坏了,美化后正好是2984行字符串
正如我在对 OP 的评论中所写,这可能是因为 SSMS 限制了结果网格中一列中显示的字符数。它对实际结果没有影响,例如结果有所有数据,只是SSMS没有全部显示。
要解决此问题,您可以增加 SSMS 检索的字符数:
我不建议 - "how long is a piece of string",而是 select 将结果放入 nvarchar(max)
变量,然后 PRINT
该变量。那应该给你整个文本。
希望对您有所帮助!
我正在尝试使用“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
到目前为止,JSON 将是:
{
"root": [{
"layouts": [{
"layoutID": 5
, "layoutName": "foo"
, "objects": []
}]
}]
}
然后将调用“queue_objects”函数来填充 'objects' 数组:
queue_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
然后 JSON 将是:
{
"root": [{
"layouts": [{
"layoutID": 5
, "layoutName": "foo"
, "objects": [{
"objectID": 1000
, "editable": "true"
, "propertyObjects": []
, "inherited": []
}, {
"objectID": 2000
, "editable": "false"
, "propertyObjects": []
, "inherited": []
}]
}]
}]
}
也会调用“inherited_counter”和“queue_properties”函数来填充相应的键。
这只是一个示例,代码将无法运行,因为我没有在此处放置函数。
但我的问题是:是同时调用彼此的函数,使服务器 return 损坏 JSON 字符串吗?还是服务器本身无法处理 JSON 超过 2984 行的字符串?
编辑:我所说的 2984 行的意思是,我在 JSON 上使用美化器,服务器不会逐行 return 字符串,它 returns JSON坏了,美化后正好是2984行字符串
正如我在对 OP 的评论中所写,这可能是因为 SSMS 限制了结果网格中一列中显示的字符数。它对实际结果没有影响,例如结果有所有数据,只是SSMS没有全部显示。
要解决此问题,您可以增加 SSMS 检索的字符数:
我不建议 - "how long is a piece of string",而是 select 将结果放入 nvarchar(max)
变量,然后 PRINT
该变量。那应该给你整个文本。
希望对您有所帮助!