SQL Server OPENJSON返回最后一个元素为null

时间:2018-12-06 19:42:56

标签: sql json sql-server

我正在尝试使用OPENJSON从JSON对象数组中返回值,但是最后一个请求的元素总是出现NULL。

基本对象是:

DECLARE
@response NVARCHAR(MAX) = '[
                                {   
                                    "uniqueID":"T0139"
                                ,   "title":"Item 1"
                                },
                                {   
                                    "uniqueID":"J0295"
                                ,   "title":"Item 3"
                                }
                            ]'

SELECT ISJON(@response)返回true。

如果我跑步:

SELECT
    uniqueID
,   title
FROM 
    OPENJSON(@response) WITH (
                        uniqueID    NVARCHAR(MAX) '$.uniqueID' 
                    ,   title       NVARCHAR(MAX) '$.title' 
                    AS JSON)    

我回来了:

uniqueID    title
T0139       NULL
J0295       NULL

但是,如果我在声明的后面加上假列:

SELECT
    uniqueID
,   title
,   doesntExist
FROM 
    OPENJSON(@response) WITH (
                        uniqueID    NVARCHAR(MAX) '$.uniqueID' 
                    ,   title       NVARCHAR(MAX) '$.title' 
                    ,   doesntExist NVARCHAR(MAX) '$.doesntExist' 
                    AS JSON)    

现在我获得标题的值:

uniqueID    title   doesntExist
T0139       Item 1  NULL
J0295       Item 3  NULL

数据显然在那里,并且可以返回。那么,为什么仅当我请求缺少节点时才起作用?我的第一句话有什么问题?

DB Fiddle:https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=aa985e8007dedbc5dea9b6b7e4243826

1 个答案:

答案 0 :(得分:2)

您只不过有一个括号而已。查看最后一行。

SELECT
    uniqueID
,   title
FROM 
    OPENJSON(@response) WITH (
                        uniqueID    NVARCHAR(MAX) '$.uniqueID' 
                    ,   title       NVARCHAR(MAX) '$.title' 
                    ) AS JSON