在SQL Server 2017中从web解析JSON
是否可以在SQL Server 2017中使用来自web的JSON响应,然后进行解析。我对从公共开放天空API获取数据感兴趣。 我尝试了这个,但在@ResponseText:在SQL Server 2017中从web解析JSON,json,sql-server,Json,Sql Server,是否可以在SQL Server 2017中使用来自web的JSON响应,然后进行解析。我对从公共开放天空API获取数据感兴趣。 我尝试了这个,但在@ResponseText: Declare @Object as Int; Declare @ResponseText as nvarchar(max); Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT; Exec sp_OAMethod @Object, 'open', NULL, 'get',
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
谢谢你的帮助 好的,我确实有一个启用了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
。因此,下一个到最后一个调用是错误。该数字转换为HRESULT0x8004271A
(谢谢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
它返回了srv\U convert中的错误错误。
。那个错误消息让我想起了,它告诉我,如果输出是一个很长的字符串,出于某种未指定的原因,您必须使用一个表,而不是一个变量
这给了我一个有效的代码:
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+附带了与旧的XML函数类似的语法,并且也同样易于使用。(也就是说,在你熟悉它们之前,这并不容易。)
- 使用JSON\u VALUE函数从JSON字符串中提取标量值李>
- 使用JSON\u QUERY从JSON字符串中提取对象或数组李>
- 使用ISJSON函数测试字符串是否包含有效的JSON李>
- 使用JSON\u MODIFY函数更改JSON字符串中的值
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
。因此,下一个到最后一个调用是错误。该数字转换为HRESULT0x8004271A
(谢谢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
它返回了srv\U convert中的错误错误。
。那个错误消息让我想起了,它告诉我,如果输出是一个很长的字符串,出于某种未指定的原因,您必须使用一个表,而不是一个变量
这给了我一个有效的代码:
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+附带了与旧的XML函数类似的语法,并且也同样易于使用。(也就是说,在你熟悉它们之前,这并不容易。)
- 使用JSON\u VALUE函数从JSON字符串中提取标量值李>
- 使用JSON\u QUERY从JSON字符串中提取对象或数组李>
- 使用ISJSON函数测试字符串是否包含有效的JSON李>
- 使用JSON\u MODIFY函数更改JSON字符串中的值
还有OPENJSON行集函数。好的,但是如何从SQL Server中的变量中获取答案?@stefan_77请查看我的更新答案以及相应的工作代码。不幸的是,我没有可用的SQLServer2016系统,所以我无法在JSON命令方面提供太多帮助。太棒了!谢谢你的帮助!现在我将处理解析:)好的,但是我如何才能从SQL Server中的变量中获取答案?@stefan_77请查看我的更新答案,以及相应的工作代码。不幸的是,我没有可用的SQLServer2016系统,所以我无法在JSON命令方面提供太多帮助。太棒了!谢谢你的帮助!现在我将处理解析:)