Openjson 在定义 nvarchar(max) 时不返回 json 对象,并且由 nvarchar(4000) 工作

Posted

技术标签:

【中文标题】Openjson 在定义 nvarchar(max) 时不返回 json 对象,并且由 nvarchar(4000) 工作【英文标题】:Openjson is not returning the json object when defining nvarchar(max), and working by nvarchar(4000) 【发布时间】:2019-11-05 13:38:54 【问题描述】:

我尝试从 JSON([查询])中提取嵌套的 JSON 如果我这样做, - 使用 nvarchar(4000),它正在工作(不幸的是,有些数据更大) - 使用 nvarchar(max) 作为 json,该字段仍然为空...为什么??

--query=null :

SELECT 
visualContainers
     ,json1.[query]                                                

FROM [ReportServer_PBI].[Sections_RowSource] [sections]  
CROSS APPLY  OPENJSON(visualContainers)
WITH (
     [query]                                                     NVARCHAR(max)   '$.query'  as json
    ,[visualContainers.displayName]                              NVARCHAR(100)   '$.displayName' 
    ) as json1

--查询包含数据:

    SELECT 
visualContainers
     ,json1.[query]                                                

FROM [ReportServer_PBI].[Sections_RowSource] [sections]  
CROSS APPLY  OPENJSON(visualContainers)
WITH (
     [query]                                                     NVARCHAR(4000)   '$.query' 
    ,[visualContainers.displayName]                              NVARCHAR(100)   '$.displayName' 
    ) as json1

【问题讨论】:

不要使用nvarchar(max),除非您确实需要存储超过 4K 的 Unicode 数据 就是这样......否则我不会有问题 很多人使用max,因此他们不必指定大小,没有意识到它会影响存储、索引和性能。 这不是查询之间的唯一区别...“不工作”查询使用as json 是的,在 openjson 中使用 nvarchar(max) 是正常的 【参考方案1】:

可能包含的 JSON 不正确。 JSON 在技术上需要 UTF8 编码,因此您可以验证这一点。您还应该验证所包含的 JSON 是否有效且未分段(包含多个 JSON 元素)。

我一直使用 nvarchar(max) ... 作为 json 并且没有任何问题,所以我怀疑它与长度有关,而是 SQL Server 可能以不同方式验证和/或解析文本的事实使用“作为 json”

【讨论】:

以上是关于Openjson 在定义 nvarchar(max) 时不返回 json 对象,并且由 nvarchar(4000) 工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在子 OPENJSON 的结果上使用 OPENJSON

NVARCHAR(MAX) 的最大长度

使用 OPENJSON 解析

SQL server中的nvarchar最大的长度是4000个字吗

nvarchar(max) 仍然被截断

sql中nvarchar(max)长度测试