首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >插入Server表中的JSON对象数据

插入Server表中的JSON对象数据
EN

Stack Overflow用户
提问于 2019-07-31 08:06:32
回答 2查看 1.5K关注 0票数 0

我正在尝试抓取每种货币的JSON对象头部,并将其插入Server表中。

这是我正在使用的代码,但是我得到了空值:

代码语言:javascript
复制
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

我得到一个空值,似乎无法得到头值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-31 08:36:36

解决方案:

在这里,你需要的是下一个声明:

代码语言:javascript
复制
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(),结果是一个列为keyvaluetype的表。使用... OPENJSON(j1.[value]) WITH ( .. ) ..时,使用显式模式执行OPENJSON(),结果是表中定义的列。

关于OPENSON()返回值的文档是这里

票数 2
EN

Stack Overflow用户

发布于 2019-07-31 08:36:46

JSON字符串只包含数组和对象(字典)。它没有头。这个JSON字符串包含一个顶级对象/字典,其中有一个带有键值currency的元素。该元素是一个具有键值"0“、"1”等键值的字典。没有什么能强迫这些元素拥有相同的键。

OPENJSONkeyvalue列的形式返回JSON字典的键/值元素。这意味着货币键将出现在key列中。value列将保存内部字典。

WITH可用于解析值并将特定属性提取为列。它不能用于解析密钥

此查询:

代码语言:javascript
复制
SELECT *
FROm OPENJSON(@json, '$.currency') j1

返回:

代码语言:javascript
复制
key value                       type
0   { "ISOCode": "USD",  ... }  5
1   { "ISOCode": "IEP",  ... }  5
2   { "ISOCode": "BEF",   ... } 5

键总是字符串。要将键转换为整数,需要CASRPARSE

代码语言:javascript
复制
SELECT cast([key] as int)
FROm OPENJSON(@json, '$.currency') j1 

第二个OPENJSON可以用于解析货币对象。如果没有WITH,将为每个属性返回一个新行。WITH可用于将属性公开为列。此查询:

代码语言:javascript
复制
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

返回:

代码语言:javascript
复制
ID  ISOCode name                symbol  real        free
0   USD     US Dollar           $       $#,###.##   #,###.##
1   IEP     Irish Pound or Punt £       £#,###.##   #,###.##
2   BEF     Belgian Franc       ₣       #,###.##₣   #,###.##
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57286031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档