如何从 TSQL 调用 Web 服务? (SQL 服务器 2000)
Posted
技术标签:
【中文标题】如何从 TSQL 调用 Web 服务? (SQL 服务器 2000)【英文标题】:How to call webservice from TSQL? (SQL SERVER 2000) 【发布时间】:2013-01-10 13:59:37 【问题描述】:我想在 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 Automation Procedures”不在生产服务器上。
更新
我修改代码以捕获错误:
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 中的错误。
根据微软(link)的说法是SqlServer的问题。因为在我的例子中,网络服务的结果超过了 4000 个字符。
如何从 TSQL 调用 Web 服务?
【问题讨论】:
您是否也在生产环境中运行了sp_configure 'show advanced options', 1;
?
检查测试服务器和生产服务器上的 SQL Server 版本。听起来他们是不同的。
@Andomar, sp_configure 'show advanced options', 1;
在生产服务器中运行良好。
这个查询的结果是什么:SELECT * FROM master.dbo.sysobjects WHERE name LIKE '%sp_OA%' AND xtype = 'X'
@Andomar,结果是:sp_OACreate, sp_OADestroy, sp_OAGetErrorInfo, sp_OAGetProperty , sp_OAMethod, sp_OASetProperty, sp_OAStop
【参考方案1】:
我刚刚偶然发现了同样的错误 - “(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
Solution Source
【讨论】:
【参考方案2】:嘿,如果您想从 T-SQL(无 SQLCLR)调用 HTTP Web 服务,我可能会对您有所帮助。您可以使用对象自动化扩展存储过程自动化 XMLHTTP 服务器对象。
Example
我建议你使用 CLR 或 SSIS 包。
【讨论】:
谢谢,但在这种情况下还必须启用 Ole 自动化程序,这是我遇到问题的地方。【参考方案3】:我通过以下方式解决了它: 使用以下代码创建一个 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
【讨论】:
以上是关于如何从 TSQL 调用 Web 服务? (SQL 服务器 2000)的主要内容,如果未能解决你的问题,请参考以下文章
尝试从 tsql 连接到 sql-azure 时从服务器读取失败