OPENJSON 将值列转换为多行不起作用

Posted

技术标签:

【中文标题】OPENJSON 将值列转换为多行不起作用【英文标题】:OPENJSON Convert Value Column to Multiple Rows does not work 【发布时间】:2019-09-27 07:27:19 【问题描述】:

我有一个结构简单的 JSON 文件。我尝试从这个 JSON 文件中提取数据到行中。

JSON 文件开头为:

["result":
["country":"Germany",
  "parent":"xxxx",
"city":"Reit***",
"latitude":"",

我试过这段代码,都成功了。 查看最后 3 条语句及其结果。 我会在 SELECT 最后一条语句中期待多条记录。 我究竟做错了什么?

DECLARE @details VARCHAR(MAX)

Select @details  =BulkColumn FROM OPENROWSET 
 (BULK 'folder/cmn_location',   DATA_SOURCE='blogstorage',    SINGLE_CLOB) as JSON;

IF (ISJSON(@details) = 1)
    BEGIN  PRINT 'Imported JSON is Valid'     END
ELSE
    BEGIN  PRINT 'Invalid JSON Imported'      END



SELECT @details as SingleRow_Column

--delivers one row Where

--SingleRow_Column=["result":[country":"Germany","parent":.....


SELECT * FROM OPENJSON(@details, '$')

--delivers one row. Where 

--Key=0, value="result":["country":"Germany","parent":"xxx".....


SELECT * FROM OPENJSON(@details, '$.result') 

--根本不提供行

现在出现错误消息,但没有数据

【问题讨论】:

【参考方案1】:

这样试试

提示:我必须添加一些右括号...

DECLARE @YourJSON NVARCHAR(MAX)=
N'["result":
["country":"Germany",
  "parent":"xxxx",
"city":"Reit***",
"latitude":""]]';

SELECT B.*
FROM OPENJSON(@YourJson)        WITH(result NVARCHAR(MAX) AS JSON) A
CROSS APPLY OPENJSON(A.result)  WITH(country NVARCHAR(1000)
                                    ,parent NVARCHAR(1000)
                                    ,city NVARCHAR(1000) ) B;

简而言之:

您的 JSON 是一个数组,包含至少一个对象 result。 (可能有更多对象,但您显示的不够多)。

这个对象result 本身就是一个数组。因此,我们将WITHAS JSON 结合使用,另一个APPLY OPENJSON 使用返回为A.result 的嵌套数组。

【讨论】:

以上是关于OPENJSON 将值列转换为多行不起作用的主要内容,如果未能解决你的问题,请参考以下文章

将值设置为 flashvars 属性不起作用

Angular - 将值从 HTML 传递到组件不起作用

UIScrollView 选择中的多行 UITextView 不起作用

在 setState 不起作用后,Reactjs 将值作为道具传递

webview javascript将值推送到上一页不起作用

通过for循环将值附加到向量不起作用