Sql server “;MSXML2.ServerXMLHTTP”;SQL Server中的请求返回NULL

Sql server “;MSXML2.ServerXMLHTTP”;SQL Server中的请求返回NULL,sql-server,http,msxml,Sql Server,Http,Msxml,这是我第一次尝试在SQL Server中实现HTTP请求,以获取JSON对象并在数据库中插入,但出于某种原因,我总是返回NULL 我用它来测试,但没有成功 sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'Ole Automation Procedures', 1; GO RECONFIGURE; GO Declare @Object as Int; Declare @ResponseText

这是我第一次尝试在SQL Server中实现HTTP请求,以获取JSON对象并在数据库中插入,但出于某种原因,我总是返回NULL

我用它来测试,但没有成功

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO



Declare @Object as Int;
Declare @ResponseText as Varchar(max);
Declare @Body as varchar(max);

Exec sp_OACreate 'MSXML2.ServerXMLHTTP', @Object OUT;
EXEC  sp_OAMethod @Object, 'open', NULL, 'get','https://jsonplaceholder.typicode.com/todos', 'false'

Exec sp_OAMethod @Object, 'setRequestHeader', null, 'Content-Type', 'application/json'
Exec sp_OAMethod @Object, 'send', null, @body

Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT
Select @ResponseText as response
答复:


我也遇到了类似的问题,问题是协议https。当我将url更改为http时,我能够从api接收到响应。要通过https调用api,请创建一个库并在SQLCLR中运行它

这将帮助您开始

有一个类似的问题,我在服务器上解决的是设置代理

EXEC @Result = sp_OACreate 'MSXML2.ServerXMLHTTP.6.0', @Obj OUT
if @Result <>0 exec sp_OAGetErrorInfo @Obj

exec @Result = sp_OAMethod @Obj, 'setProxy', NULL, '2', 'http://yourProxyHere'
if @Result <>0 exec sp_OAGetErrorInfo @Obj
EXEC@Result=sp_OACreate'MSXML2.ServerXMLHTTP.6.0',@Obj OUT
如果@Result 0 exec sp_OAGetErrorInfo@Obj
exec@Result=sp_OAMethod@Obj,'setProxy',NULL,'2','http://yourProxyHere'
如果@Result 0 exec sp_OAGetErrorInfo@Obj
使用

将@ResponseText声明为Varchar(8000);

将@ResponseText声明为NVarchar(4000);
而不是

将@ResponseText声明为Varchar(max);
--对于大响应来说很重要:

SET TEXTSIZE 2147483647

Declare @ResponseText as nvarchar(max);

DECLARE @responseTextTable table(responseText nvarchar(max));


我不确定,但也许您需要注释掉
setRequestHeader
行(您没有发送任何内容),并将
Exec sp_OAMethod@Object,'responseText',@responseText OUTPUT
替换为
Exec sp_OAGetProperty@Object,'responseText',@responseText OUTPUT
。我相信响应文本是一种属性。请为您自己的心智健全,考虑从客户端代码,而不是直接从SQL Server这样做。正如您所发现的,故障排除过程非常糟糕,您需要小心不要泄漏资源(忘记调用
sp\u OADestroy
——您的代码确实忽略了这一点)。您可以从SQL Server内部发出HTTP请求,这并不意味着您应该这样做。
insert into @responseTextTable (responseText)
Exec sp_OAMethod @Object, 'responseText'
 
select @ResponseText = responseText from @responseTextTable