是否可以在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
感谢您的帮助!
答案 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
正在运行,返回0
,0
,0
,-2147211494
,0
。所以倒数第二个呼叫是错误。该数字转换为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 行集功能。