Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server 2017中从web解析JSON_Json_Sql Server - Fatal编程技术网

在SQL Server 2017中从web解析JSON

在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',

是否可以在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',
             '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
。因此,下一个到最后一个调用是错误。该数字转换为HRESULT
0x8004271A
(谢谢
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行集函数。

好的,我确实有一个启用了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
。因此,下一个到最后一个调用是错误。该数字转换为HRESULT
0x8004271A
(谢谢
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命令方面提供太多帮助。太棒了!谢谢你的帮助!现在我将处理解析:)