首页 > 解决方案 > 如何在 SQL Server 的表列中添加从父 JSON 读取的 JSON 值?

问题描述

我正在尝试读取 JSON 并将值插入表中。在这些值中,还有一个 JSON 对象。我正在尝试将该 JSON 值插入到列中,但我的代码没有插入任何内容。

这是我到目前为止所尝试的:

DROP TABLE IF EXISTS #tmp

DECLARE @json NVARCHAR(MAX);
SET @json = N'[
  {"id": 2, "info": {"name": "John", "surname": "Smith"}, "age": 25},
  {"id": 5, "info": {"name": "Jane", "surname": "Smith"}, "dob": "2005-11-04T12:00:00"}
]';

SELECT [id], [info] 
INTO #tmp
FROM OPENJSON(@json)
     WITH
         (
          [id] NVARCHAR(100), 
          [info] NVARCHAR(max)
         );

SELECT * FROM #tmp

这是我得到的结果:

id  info
--------------
2   NULL
5   NULL

标签: sqljsonsql-serverjsondb

解决方案


如果我正确理解您的问题,您需要使用AS JSON文档中提到的选项:

在列定义中使用 AS JSON 选项来指定引用的属性包含内部 JSON 对象或数组。如果您指定 AS JSON 选项,则列的类型必须是 NVARCHAR(MAX)。

陈述:

DECLARE @json NVARCHAR(MAX);
SET @json = N'[
  {"id": 2, "info": {"name": "John", "surname": "Smith"}, "age": 25},
  {"id": 5, "info": {"name": "Jane", "surname": "Smith"}, "dob": "2005-11-04T12:00:00"}
]';

SELECT [id], [info] 
INTO #tmp
FROM OPENJSON(@json) WITH (
  [id] NVARCHAR(100) '$.id', 
  [info] NVARCHAR(max) '$.info' AS JSON
);

结果:

id  info
2   {"name": "John", "surname": "Smith"}
5   {"name": "Jane", "surname": "Smith"}

推荐阅读