【发布时间】:2016-11-12 02:50:45
【问题描述】:
我在使用新引入的 JSON_VALUE 函数访问 json 中的数组时卡住了。请考虑以下代码 -
IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='JsonData')
DROP TABLE JsonData;
go
CREATE TABLE JsonData(JsonData nvarchar(max));
DECLARE @SQL nvarchar(max);
DECLARE @Table AS TABLE(JsonPath VARCHAR(256));
INSERT INTO JsonData(JsonData)
VALUES(
'{
"firstName": "John",
"lastName" : "doe",
"age" : 26,
"address" : {
"streetAddress": "naist street",
"city" : "Nara",
"postalCode" : "630-0192"
},
"phoneNumbers": [
{
"type" : "iPhone",
"number": "0123-4567-8888"
},
{
"type" : "home",
"number": "0123-4567-8910"
}
]
}')
INSERT INTO @Table
SELECT VALUE FROM OPENJSON('{
"Path1":"$.firstName","Path2":"$.phoneNumbers[:1].number"
}') ;
SELECT @SQL=(SELECT 'UNION SELECT '''+ CAST(JsonPath AS VARCHAR(256)) +''',JSON_VALUE(JsonData,'''+a.JsonPath+''')
FROM JsonData a'
FROM @Table a
FOR XML PATH(''), TYPE)
.value('.','NVARCHAR(MAX)')
FROM @Table t;
SELECT @SQL=RIGHT(@SQL,LEN(@SQL)-5)
PRINT @SQL
EXEC SP_EXECUTESQL @SQL;
这里如果我想访问特定的电话号码,那么访问此节点的常规语法不起作用。在这种情况下,我收到以下错误
JSON path is not properly formatted. Unexpected character ':' is found at position 15.
虽然当我检查 http://jsonpath.com 时,我能够检索值。 SQL Server 2016 是否使用一些不同的语法来访问 JSON 值?
【问题讨论】:
-
这是题外话,但知道可能有用。您可以使用 DROP TABLE IF EXISTS JsonData 而不是 if (select) drop table....
-
同意,旧习惯很难改掉 :-)
标签: sql sql-server json sql-server-2016