我正在尝试使用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
答案 0 :(得分:2)
您只不过有一个括号而已。查看最后一行。
SELECT
uniqueID
, title
FROM
OPENJSON(@response) WITH (
uniqueID NVARCHAR(MAX) '$.uniqueID'
, title NVARCHAR(MAX) '$.title'
) AS JSON