【问题标题】:Calling an API and storing the data in to an SQL Server table调用 API 并将数据存储到 SQL Server 表中
【发布时间】:2020-05-15 16:00:26
【问题描述】:

我正在尝试使用从 Stackoverflow 获得的解决方案来调用 api 并以表格格式解析数据。但是,由于其结构方式,我在解析数据时发现了一个问题。

Declare @Object as Int;
DECLARE @hr  int
Declare @json as table(Json_Table nvarchar(max))

Exec @hr=sp_OACreate 'MSXML2.ServerXMLHTTP.6.0', @Object OUT;`enter code here`
IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object
Exec @hr=sp_OAMethod @Object, 'open', NULL, 'get',
                 'https://accaho.nanorep.co/api/report/v1/get.json?account=accaho&apikey=xxxxxxxxxxxxxxf&days=1&fields=source.time,source.kb_name,source.domain,content.query,content.resultFound,content.articleID,content.articleTitle,content.articleLabels,content.articleContext.Applications,translation.autoTranslated,translation.customersLanguage,translation.originalMessage,channel.rechanneled,channel.channelType,feedback.feedbackType,feedback.feedbackReason,feedback.feedbackText,count.resolved,count.interactions,count.feedback,count.feedbackPositive,count.feedbackNegative&kb=English', --Your Web Service Url (invoked)
                 'false'
IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object
Exec @hr=sp_OAMethod @Object, 'send'
IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object
Exec @hr=sp_OAMethod @Object, 'responseText', @json OUTPUT
IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object

INSERT into @json (Json_Table) exec sp_OAGetProperty @Object, 'responseText'
-- select the JSON string
select * from @json
SELECT * FROM OPENJSON((select * from @json), N'$.rows')

我有点卡在这里......我如何将这些数据解析为表格结构。请帮忙

【问题讨论】:

    标签: json sql-server api parsing


    【解决方案1】:

    如果要解析并从 $.rows JSON 数组中获取值,则需要使用额外的 OPENJSON() 调用,因为输入 JSON 的 $.rows 部分是 JSON 数组的 JSON 数组。正确的语法取决于 JSON 结构,您可以使用 default or explict schema 解析输入 JSON:

    使用默认模式解析输入 JSON 的 $.rows 部分的语句:

    -- .....
    
    SELECT j1.[value], j2.[key], j2.[value] 
    FROM @json d
    CROSS APPLY OPENJSON(d.Json_Table, N'$.rows') j1
    CROSS APPLY OPENJSON(j1.[value]) j2
    

    带有列定义的语句(列名和数据类型可以不同):

    SELECT j1.[value], j2.* 
    FROM @json d
    CROSS APPLY OPENJSON(d.Json_Table, N'$.rows') j1
    CROSS APPLY OPENJSON(j1.[value]) WITH (
        Column1 varchar(100) '$[0]',
        Column2 varchar(100) '$[1]',
        ...
        Column21 varchar(100) '$[20]'
    ) j2
    

    如果要从输入 JSON 的 $.fields 部分获取列定义,则需要动态语句。

    DECLARE @json nvarchar(max) = N'{
        "fields":["source.time","source.kb_name"],
        "rows":[
            ["63725381805336","English","gph.accenture.com"],
            ["63725381805336","English","gph.accenture.com"],
            ["63725381797070","English","gph.accenture.com"],
            ["63725381797070","English","gph.accenture.com"],
            ["63725381755149","English","gph.accenture.com"]
        ]
    }'
    
    DECLARE @stm nvarchar(max)
    SELECT @stm = STRING_AGG(CONCAT(QUOTENAME([value]), N' varchar(max) ''$[', [key], N']'''), ', ')
    FROM OPENJSON(@json, '$.fields')
    SELECT @stm = CONCAT(
        N'SELECT * ',
        N'FROM OPENJSON(@json, N''$.rows'') WITH (', @stm, N')'
    )
    
    PRINT @stm
    EXEC sp_executesql @stm, N'@json nvarchar(max)', @json
    

    【讨论】:

    • 谢谢。现在我可以将行值视为一列。我怎样才能将这些每个值放入表列中。我的表有 21 列。这里的每个值都应该转到相应的列...
    • 这是一行数据: 键值 0 63725391502961 1 英语 2 gph.accenture.com 3 Athena 开场陈述与语言选择 4 True 5 1518752271 6 Athena 开场陈述与语言选择 7 Bot 8 Athena 9错误 10 11 12 错误 13 14 15 16 17 1 18 1 19 0 20 0 21 0
    • @AnoopKumarKR 您需要一个具有显式模式的语句(带有列定义的WITH 子句)。答案已更新。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-04
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    相关资源
    最近更新 更多