在SQL Server 2017中从Web解析JSON

时间:2017-12-06 18:11:49

标签: json sql-server

是否可以在SQL Server 2017中从Web使用JSON响应然后解析。我有兴趣从公共Open Sky API获取数据。 我试过这个,但我在@ResponseText中得到NULL:

Declare @Object as Int;
Declare @ResponseText as nvarchar(max);


 Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
 Exec sp_OAMethod @Object, 'open', NULL, 'get',
             'https://opensky-network.org/api/states/all', 
             'false'
 Exec sp_OAMethod @Object, 'send'
 Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT


 Select @ResponseText

 Exec sp_OADestroy @Object

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

好的,我有一个启用了OLE自动化的SQL Server 2008实例,所以我可以帮助解决这个问题,但不是用JSON解析。

首先,几乎每个人都普遍说,“使用SQLCLR执行此操作而不是OLE自动化。”您应该考虑将SQLCLR用于新项目。

其次,这就是我如何弄明白的。首先,所有sp_OA*存储过程都返回结果代码。我们需要看到:

Declare @Object as Int;
Declare @ResponseText as nvarchar(max);
Declare @hr int;

Exec @hr = sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
select @hr;
Exec @hr = sp_OAMethod @Object, 'open', NULL, 'get',
             'https://opensky-network.org/api/states/all', 
             'false';
select @hr;
Exec @hr = sp_OAMethod @Object, 'send';
select @hr;
Exec @hr = sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT;
select @hr;
Exec @hr = sp_OADestroy @Object
select @hr

正在运行,返回000-21472114940。所以倒数第二个呼叫是错误。该数字转换为0x8004271A的HRESULT(谢谢calc.exe,虽然您也可以使用PowerShell:'{0:x}' -f -2147211494),但这并没有引导我到任何地方。但是,它确实告诉我们在哪里使用sp_OAGetErrorInfo

Declare @Object as Int;
Declare @ResponseText as nvarchar(max);
Declare @source nvarchar(255), @description nvarchar(255)

Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
Exec sp_OAMethod @Object, 'open', NULL, 'get',
             'https://opensky-network.org/api/states/all', 
             'false';
Exec sp_OAMethod @Object, 'send';
Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT;

Exec sp_OAGetErrorInfo @Object, @Source OUT, @Description OUT

Select @source, @description;

Exec sp_OADestroy @Object

返回错误Error in srv_convert.。该错误消息导致我here,如果由于某些未指定的原因它是一个非常长的字符串,则表示您必须使用表而不是输出变量。

这给了我有效的代码:

Declare @Object as Int;
Declare @Response table (txt nvarchar(max));

Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
Exec sp_OAMethod @Object, 'open', NULL, 'get',
             'https://opensky-network.org/api/states/all', 
             'false';
Exec sp_OAMethod @Object, 'send';

Insert Into @Response (txt)
Exec sp_OAMethod @Object, 'responseText'

Exec sp_OADestroy @Object   

Select txt From @Response

SQL Server 2016+附带JSON parsing functions,它具有与旧XML函数类似的语法,并且易于使用。 (也就是说:在你熟悉它们之前不是很容易。)

  
      
  • 使用 JSON_VALUE 函数从JSON字符串中提取标量值。
  •   
  • 使用 JSON_QUERY 从JSON字符串中提取对象或数组。
  •   
  • 使用 ISJSON 函数测试字符串是否包含有效的JSON。
  •   
  • 使用 JSON_MODIFY 函数更改JSON字符串中的值。
  •   

还有 OPENJSON 行集功能。