4

我想在 SQL Server 2000 中从 TSQL 调用 Web 服务。我尝试使用以下代码:

Declare @Object as Int; 
Declare @ResponseText as Varchar(8000);
Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
Exec sp_OAMethod @Object, 'open', NULL, 'get','http://server/ws/service1.asmx/Test', 'false';
Exec sp_OAMethod @Object, 'send';
Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT;
Select @ResponseText Resultado;
Exec sp_OADestroy @Object;

为此,我必须启用 Ole 自动化:

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

在我的测试服务器上工作正常,问题是在生产服务器上运行

sp_configure 'Ole Automation Procedures', 1; 

我收到以下错误:

配置选项“Ole 自动化程序”不存在,或者它可能是一个高级选项。

跑步时

exec sp_configure 

测试服务器上的记录“Ole 自动化程序”在生产服务器上没有。

更新

我修改代码以捕获错误:

Declare @Object as Int; 
Declare @ResponseText as Varchar(8000);
Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
Exec sp_OAMethod @Object, 'open', NULL, 'get','http://server/ws/service1.asmx/Test', 'false';
Exec sp_OAMethod @Object, 'send';
Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT;
EXEC sp_OAGetErrorInfo @Object
Select @ResponseText Resultado;
Exec sp_OADestroy @Object;

指令“sp_OAGetErrorInfo EXEC @ Object”返回:(0x8004271A) srv_convert 中的错误。

根据 Microsoft(链接)是 SqlServer 的问题。因为在我的情况下,网络服务的结果超过了 4000 个字符。

如何从 TSQL 调用 Web 服务?

4

3 回答 3

2

我只是偶然发现了同样的错误-“(0x8004271A)srv_convert 中的错误。”

要克服字符限制,请使用如下 #tmp 表:

Create table #tmp(dt nvarchar(max))
insert into #tmp 
exec @hr =sp_OAGetProperty @objWinHttp, 'ResponseText'
Select dt from #tmp -- single column/single row.
Drop Table #tmp -- clean up

解决方案来源

于 2016-12-28T19:18:16.627 回答
1

嘿嘿,如果您想从 T-SQL(无 SQLCLR)调用 HTTP Web 服务,我可能会对您有所帮助。您可以使用对象自动化扩展存储过程自动化 XMLHTTP 服务器对象。

例子

不过,我建议您使用 CLR 或 SSIS 包。

于 2013-01-10T14:12:13.943 回答
1

我通过以下方式解决了它:使用以下代码
创建一个 VBScript 文件(callWS.vbs ):

if WScript.Arguments.Count = 1 then
    Set http = CreateObject("Microsoft.XmlHttp")
    http.open "GET", WScript.Arguments(0), FALSE
    http.send ""
    WScript.Echo http.responseText
else
    WScript.Echo "Not was provided the WS address."
end if

然后在 TSQL 中:

declare @Command varchar(100)
declare @RetInfo varchar(8000)
select @Command = 'cscript c:\callWS.vbs "http://server/ws/service1.asmx/Test"'
print @Command
exec @RetInfo = master.dbo.xp_cmdshell @Command
print @RetInfo
于 2013-01-11T12:21:18.757 回答