【问题标题】:SQL Server - "for json path" statement does not return more than 2984 lines of JSON stringSQL Server - “for json path”语句不返回超过 2984 行的 JSON 字符串
【发布时间】:2018-02-03 08:28:41
【问题描述】:

我正在尝试使用“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”函数来填充相应的键。

这只是一个示例,由于我没有在此处放置函数,因此代码将不起作用。
但我的问题是:是函数同时相互调用,使服务器返回损坏的 JSON 字符串吗?还是服务器本身无法处理超过 2984 行的 JSON 字符串?

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

【问题讨论】:

  • 当您获得 2984 行时 - 您是否在 SSMS 中运行它?为什么我要问是因为 SSMS 对执行 SELECT 时返回的数量有限制:“工具 | 选项 | 查询结果 | SQL Server | 网格结果 | 检索到的最大字符数。”
  • 是的,我确实在 SSMS 上运行了我的查询,我认为这应该是答案!那么如何增加可以获得的数据量呢?这整个故事是否会影响我从网页获得的结果?查询数据库以获取结果的页面?

标签: sql json sql-server-2016 json-query for-json


【解决方案1】:

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

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

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

希望这会有所帮助!

【讨论】:

  • 这是正确的,SSMS 只会返回有限数量的数据,即使我把它放在一个变量中然后打印或选择它。但是当我在生产环境中得到这些数据时,它就完成了。
  • 您似乎无法将“非 XML 数据”值增加到 65535 以上。:(
  • 我用 NVARCHAR(MAX) 和 PRINT 尝试了建议,它被截断了,与结果网格中的一样。
  • 这有什么更新吗?我在使用 tedious.js 驱动程序时遇到了这个问题。似乎不是 SSMS 问题。
猜你喜欢
  • 2016-12-18
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
相关资源
最近更新 更多