我正在尝试抓取每种货币的JSON对象头部,并将其插入Server表中。
这是我正在使用的代码,但是我得到了空值:
DECLARE @json NVARCHAR(MAX) = N'{
"currency": {
"0": {
"ISOCode": "USD",
"name": "US Dollar",
"symbol": "$",
"real": "$#,###.##",
"free": "#,###.##"
},
"1": {
"ISOCode": "IEP",
"name": "Irish Pound or Punt",
"symbol": "£",
"real": "£#,###.##",
"free": "#,###.##"
},
"2": {
"ISOCode": "BEF",
"name": "Belgian Franc",
"symbol": "₣",
"real": "#,###.##₣",
"free": "#,###.##"
}
}
}'
SELECT j2.*
INTO #TempCurrencyTable
FROm OPENJSON(@json, '$.currency') j1
CROSS APPLY OPENJSON(j1.[value]) WITH (
currency INT
) j2
SELECT *
FROM #TempCurrencyTable我得到一个空值,似乎无法得到头值。

发布于 2019-07-31 08:36:36
解决方案:
在这里,你需要的是下一个声明:
SELECT
j1.[key],
j2.*
INTO #TempCurrencyTable
FROM OPENJSON(@json, '$.currency') j1
CROSS APPLY OPENJSON(j1.[value]) WITH (
ISOCode NVARCHAR(10),
name NVARCHAR(50),
symbol NVARCHAR(50)
) j2解释:
使用... OPENJSON(@json, '$.currency') j1 ...时,使用默认模式执行OPENJSON(),结果是一个列为key、value和type的表。使用... OPENJSON(j1.[value]) WITH ( .. ) ..时,使用显式模式执行OPENJSON(),结果是表中定义的列。
关于OPENSON()返回值的文档是这里。
发布于 2019-07-31 08:36:46
JSON字符串只包含数组和对象(字典)。它没有头。这个JSON字符串包含一个顶级对象/字典,其中有一个带有键值currency的元素。该元素是一个具有键值"0“、"1”等键值的字典。没有什么能强迫这些元素拥有相同的键。
OPENJSON以key和value列的形式返回JSON字典的键/值元素。这意味着货币键将出现在key列中。value列将保存内部字典。
WITH可用于解析值并将特定属性提取为列。它不能用于解析密钥
此查询:
SELECT *
FROm OPENJSON(@json, '$.currency') j1返回:
key value type
0 { "ISOCode": "USD", ... } 5
1 { "ISOCode": "IEP", ... } 5
2 { "ISOCode": "BEF", ... } 5键总是字符串。要将键转换为整数,需要CASR或PARSE:
SELECT cast([key] as int)
FROm OPENJSON(@json, '$.currency') j1 第二个OPENJSON可以用于解析货币对象。如果没有WITH,将为每个属性返回一个新行。WITH可用于将属性公开为列。此查询:
SELECT
cast(j1.[key] as int) ID,
j2.*
FROm OPENJSON(@json, '$.currency') j1
CROSS APPLY OPENJSON(j1.[value])
with ( ISOCode nvarchar(3),
[name] nvarchar(30),
symbol nvarchar(3),
[real] nvarchar(10),
free nvarchar(10)) j2返回:
ID ISOCode name symbol real free
0 USD US Dollar $ $#,###.## #,###.##
1 IEP Irish Pound or Punt £ £#,###.## #,###.##
2 BEF Belgian Franc ₣ #,###.##₣ #,###.##https://stackoverflow.com/questions/57286031
复制相似问题