问题描述
我需要从具有 JSON 格式的列中提取值。 这是该列的表中行之一的示例,这里有两个 operatorKeys,但在其他行中可能有更多:
{
"officeId": "office8685","TypeOfOffice": null,"Telefonnummer": "","Operatorer": [
{
"OperatorKey": "1","OperatorUserID": {
"Agency": "Other","AgencySpecified": true,"Value": "TM-Oper-1"
},"Contactinformation": {
"FirstName": "mike","LastName": null,"Address": {
"Street": null,"City": null,"Province": null,"Country": null
},"Phone": null,"Fax": null,"Email": null,}
},{
"OperatorKey": "4","Value": "TM-Oper-4"
},"Contactinformation": {
"FirstName": "xxx",}
}
]
}
这是我尝试读取 JSON 的 sql 视图,我使用 openjson
和 cross apply
读取值:
Alter view dbo.vOffice as
select
column1,column2
--,column3 --this column contains values with json format,OfficId,TypeOfOffice,Telefonnummer,Operatorer,OperatorKey,OperatorUserID,Contactinformation,Agency,AgencySpecified,[Value],FirstName,LastName,[Address],Phone,Fax,Email
FROM [produktion_dim].[VirkesverdeStandardSCD1]
CROSS APPLY OPEnjsON (column3,'$.OfficId') with (
OfficId varchar(4096) '$.OfficId',TypeOfOffice varchar(4096) '$.TypeOfOffice',Telefonnummer varchar(4096) '$.Telefonnummer',Operatorer varchar(4096) '$.Operatorer')
cross apply openjson(Operatorer,'$') with(OperatorKey varchar(4096) '$.OperatorKey',OperatorUserID varchar(4096) '$.OperatorUserID',Contactinformation varchar(4096) '$.Contactinformation')
cross apply openjson(OperatorUserID,'$') with ( Agency varchar(4096) '$.Agency',AgencySpecified varchar(4096) '$.AgencySpecified',[Value] varchar(4096) '$.Value' )
cross apply openjson( Contactinformation,'$') with (FirstName varchar(4096) '$.FirstName',LastName varchar(4096) '$.LastName',[Address] varchar(4096) '$.Address',Phone varchar(4096) '$.Phone',Fax varchar(4096) '$.Fax',Email varchar(4096) '$.Email')
cross apply openjson([Address],'$') with ( Street varchar(4096) '$.Street',City varchar(4096) '$.City',Province varchar(4096) '$.Province',Country varchar(4096) '$.Country')
但是我遇到了错误。您能告诉我 sql 视图中缺少什么或应该更改什么吗?
解决方法
一旦您可以组织发送者以发送正确格式的 JSON 数据,这里有一些技巧可以帮助您解析 JSON 数据:
-
'$'
中的openjson(something,'$') with (...)
是多余的,只需使用openjson(something) with (...)
- JSON 路径查询区分大小写:
$.officeId
与$. OfficeId
不同,两者都不匹配'$.OfficId'
。 - 在
with (...)
中声明一个列要被另一个openjson()
调用使用时,它需要使用类型nvarchar(max)
并在其定义中包含as json
,例如:{{ 1}}。
我已编辑您的查询以提取我认为您正在寻找的 JSON 数据...
OperatorUserID nvarchar(max) '$.OperatorUserID' as json