【问题标题】:Import JSON in SQL Server在 SQL Server 中导入 JSON
【发布时间】:2020-09-17 09:12:03
【问题描述】:

我想将以下 JSON 文件导入 SQL Server

{
  "Positions" : [
    {
      "Position" : {
        "code" : 5000042479,
        "Company" : "IN0009",
        "Region" : "APAC"
      }
    },
    {
      "Position" : {
        "code" : 1432042479,
        "Company" : "IN0010",
        "Region" : "SAFG"
      }
    }
  ]
}

到目前为止我尝试过的是:

DECLARE @json NVARCHAR(1000) 
SELECT
   @json = N'{
 "Positions" : [ { "Position" : { "code" : 5000042479,
   "Company" : "IN0009",
   "Region" : "APAC" } },
   { "Position" : { "code" : 1432042479,
   "Company" : "IN0010",
   "Region" : "SAFG" } } ] }'
 
   SELECT
      [Position.code],
      [Position.Company],
      [Position.Region] 
   FROM
      OPENJSON (@json, '$.Positions') WITH ( [Position.code] varchar(20), [Position.Company] varchar(20), [Position.Region] INT ) AS Pos

但问题是它返回 NULL 值:

+---------------+------------------+-----------------+
| Position.code | Position.Company | Position.Region |
+---------------+------------------+-----------------+
| NULL          | NULL             | NULL            |
+---------------+------------------+-----------------+
| NULL          | NULL             | NULL            |
+---------------+------------------+-----------------+

我应该如何读取这些值?有没有一种方法可以从 JSON 中动态获取列名,而无需像我一样声明它们。 [Position.code] varchar(20), [Position.Company] varchar(20)... 等等?

【问题讨论】:

    标签: sql json sql-server import


    【解决方案1】:

    您需要为显式架构中的每一列指定正确的path 表达式(以及Position.Region 列的正确数据类型):

    JSON:

    DECLARE @json NVARCHAR(1000) 
    SELECT @json = N'{
      "Positions" : [
        {
          "Position" : {
            "code" : 5000042479,
            "Company" : "IN0009",
            "Region" : "APAC"
          }
        },
        {
          "Position" : {
            "code" : 1432042479,
            "Company" : "IN0010",
            "Region" : "SAFG"
          }
        }
      ]
    }'
    

    声明:

    SELECT
       [Position.code],
       [Position.Company],
       [Position.Region] 
    FROM
       OPENJSON (@json, '$.Positions') WITH ( 
          [Position.code] varchar(20) '$.Position.code', 
          [Position.Company] varchar(20) '$.Position.Company', 
          [Position.Region] varchar(20) '$.Position.Region' 
       ) AS Pos
    

    结果:

    Position.code   Position.Company    Position.Region
    5000042479      IN0009              APAC
    1432042479      IN0010              SAFG
    

    如果$.Positions JSON 数组具有固定结构,并且您想获取每个键的名称(如果您想构建动态语句),只需使用 OPENJSON() 和默认值解析此 JSON 数组中的第一项架构:

    SELECT [key]
    FROM OPENJSON (@json, '$.Positions[0].Position')
    

    结果:

    key
    -------
    code
    Company
    Region
    

    【讨论】:

      【解决方案2】:

      这里有多层 JSON,所以可以嵌套 OPENJSON 功能:

      SELECT PP.code,
             PP.Company,
             PP.Region 
      FROM
          OPENJSON(@json, '$.Positions')
              WITH (Position nvarchar(MAX) AS JSON) P
          CROSS APPLY OPENJSON(P.Position,'$')
                          WITH(code varchar(20),
                               Company varchar(20),
                               Region int) PP;
      

      请注意,这会返回以下错误,因为我已在您的问题中复制了您定义的数据类型:

      将 nvarchar 值“APAC”转换为数据类型 int 时转换失败。

      我认为Region 应该真的是varchar(4)。如果是,这工作正常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-09
        • 1970-01-01
        • 1970-01-01
        • 2015-03-22
        • 2014-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多