SQL Server 2016中存储过程中的OPENJSON语法

SQL Server 2016中存储过程中的OPENJSON语法,json,sql-server-2016,open-json,Json,Sql Server 2016,Open Json,下面是本页最后一个示例 它提取数据并将其加载到表中。我觉得我的语法在最后一步是错误的。代码提取数据,但我的OPENJSON错误,因此没有数据放入表中。感谢您的帮助 DECLARE @Object AS INT; DECLARE @hr INT DECLARE @json AS TABLE (Json_Table NVARCHAR(MAX)) DECLARE @pmidList NVARCHAR(MAX) SET @PMIDLIST = '17784783,19505939,30166592'

下面是本页最后一个示例

它提取数据并将其加载到表中。我觉得我的语法在最后一步是错误的。代码提取数据,但我的
OPENJSON
错误,因此没有数据放入表中。感谢您的帮助

DECLARE @Object AS INT;
DECLARE @hr INT
DECLARE @json AS TABLE (Json_Table NVARCHAR(MAX))

DECLARE @pmidList NVARCHAR(MAX)
SET @PMIDLIST = '17784783,19505939,30166592' 

DECLARE @url NVARCHAR(MAX)
SET @url = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&retmode=json&id='+ @pmidList 

EXEC @hr = sp_OACreate 'MSXML2.ServerXMLHTTP.6.0', @Object OUT;
IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object

EXEC @hr = sp_OAMethod @Object, 'open', NULL, 'get',
       @url OUT,
       '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

-- Parse the JSON string
SELECT * 
FROM OPENJSON((SELECT * FROM @json), N'$.result')
WITH (  
  [uid] NVARCHAR(MAX) N'$.uids.uid',
  [title] NVARCHAR(MAX) N'$.uids.title' ,
  [sortpubdate] NVARCHAR(MAX) N'$.uids.sortpubdate',
  [epubdate] NVARCHAR(MAX) N'$.uids.epubdate'
 )

EXEC sp_OADestroy @Object
我想知道是否有可能解析

添加编辑数据

DECLARE @json NVARCHAR(MAX)
SET @json = '{
    "header": {
        "type": "esummary",
        "version": "0.3"
    },
    "result": {
        "uids": [
            "17784783",
            "19505939",
            "30166592"
        ],
        "17784783": {
            "uid": "17784783",
            "pubdate": "2007 Aug",
            "epubdate": "2007 Jul 20",
            "source": "PLoS Comput Biol",          
            "sortpubdate": "2007/08/01 00:00"          
        },
        "19505939": {
            "uid": "19505939",
            "pubdate": "2009 Aug 1",
            "epubdate": "2009 Jun 8",
            "source": "Bioinformatics",          
            "sortpubdate": "2009/08/01 00:00"
              },
        "30166592": {
            "uid": "30166592",
            "pubdate": "2019 Jan",
            "epubdate": "2018 Aug 30",
            "source": "Oncogene",
             "sortpubdate": "2019/01/01 00:00"

        }
    }
}'
print @json

SELECT * FROM OPENJSON((select * from @json), N'$.result')
WITH (  

  [uid] nvarchar(max) N'$.uids.uid' ,
  [sortpubdate] nvarchar(max) N'$.uids.sortpubdate',
  [epubdate] nvarchar(max) N'$.uids.epubdate'
  )
需要的结果

  17784783         2007/08/01 00:00        2007 Jul 20
  19505939         2009/08/01 00:00        2009 Jun 8  
  30166592         2019/01/01 00:00        2018 Aug 30   

一种方法是对json字符串使用
openjson
,并将其与另一个
openjson
内部数组交叉应用:

SELECT [uid], [sortpubdate], [epubdate]
FROM OPENJSON(@json, N'$.result') As items
CROSS APPLY
-- parse each object in the array
OPENJSON(items.[value])
WITH(
    [uid] nvarchar(max) N'$.uid' ,
    [sortpubdate] nvarchar(max) N'$.sortpubdate',
    [epubdate] nvarchar(max) N'$.epubdate'
) As content
WHERE [key] <> 'uids' -- Get only the relevant content

如果您询问您对
openjson
的使用情况,为什么我们需要先查看所有代码?如果您可以将您的问题包含为DDL+DML的示例数据和预期结果,那么回答起来就容易多了。我将所有代码都放在那里,这样人们就可以复制、粘贴并执行到SQL Studio中,并获得准确的输出。那是错的吗?总的来说,不,那不是错的。但是,所有这些存储过程都需要我们中的一些人可能没有的权限,我不知道其他大多数用户的情况,但是当我想回答SQL问题时,我通常会先在rextester或dbfiddle上尝试我的解决方案,出于安全原因,您不能在这些服务上运行这些过程。根据经验,如果你的问题可以是独立的,那么它应该是独立的。不要让我们通过互联网获取数据,只需将其纳入问题本身即可
SELECT [uid], [sortpubdate], [epubdate]
FROM OPENJSON(@json, N'$.result') As items
CROSS APPLY
-- parse each object in the array
OPENJSON(items.[value])
WITH(
    [uid] nvarchar(max) N'$.uid' ,
    [sortpubdate] nvarchar(max) N'$.sortpubdate',
    [epubdate] nvarchar(max) N'$.epubdate'
) As content
WHERE [key] <> 'uids' -- Get only the relevant content
uid         sortpubdate         epubdate
17784783    2007/08/01 00:00    2007 Jul 20
19505939    2009/08/01 00:00    2009 Jun 8
30166592    2019/01/01 00:00    2018 Aug 30