【发布时间】:2008-12-30 13:26:28
【问题描述】:
我可以从存储过程调用远程 Web 服务并使用重新调整的值吗?
【问题讨论】:
标签: sql web-services tsql
我可以从存储过程调用远程 Web 服务并使用重新调整的值吗?
【问题讨论】:
标签: sql web-services tsql
如果您使用的是 SQL 2005/2008,如果您能够安装和运行这些存储过程,则可以通过 CLR 存储过程执行此操作。欲了解更多信息:
【讨论】:
Service Broker 可能会提供您在此处寻找的那种功能。
【讨论】:
正如 The AntiSanta 所说,使用 CLR 存储过程是可能的。真正的问题是你是否可以完全避免它。从存储过程调用 Web 服务感觉是颠倒的。理想情况下,您应该有一些其他服务/应用程序/层同时调用存储过程和 Web 服务。可能存储的过程会返回 Web 服务的参数值,并且您在 WS 调用完成后提交本地事务。
从长远来看,这将使调试、部署和支持更加简单,并解耦存储过程和 Web 服务之间的直接引用。
【讨论】:
在 SQL Server 2000 及更高版本(如果未启用 CLR)上,如果您的 Web 服务已有 COM 包装器,则可以通过存储过程(sp_OACreate、sp_OAMethod 等)使用 COM。
【讨论】:
这是我的有效代码。
exec @hr = sp_OACreate 'MSXML2.ServerXMLHttp', @obj OUT
if @hr < 0 begin Raiserror('sp_OACreate MSXML2.ServerXMLHttp failed',16,1)
return end
exec @hr = sp_OAMethod @obj, 'Open', NULL, 'GET', @UrlString, false
if @hr <0 begin set @msg = 'sp_OAMethod Open failed' goto eh end
exec @hr = sp_OAMethod @obj, 'send'
if @hr <0 begin set @msg = 'sp_OAMethod Send failed' goto eh end
exec @hr = sp_OAGetProperty @obj, 'status', @status OUT
if @hr <0 begin set @msg = 'sp_OAMethod read status failed' goto eh end
if @status <> 200 begin set @msg = 'sp_OAMethod http status ' +str(@status) goto eh end
exec @hr = sp_OAGetProperty @obj, 'responseText', @response OUT
if @hr <0 begin set @msg = 'sp_OAMethod read response failed' goto eh end
exec @hr = sp_OADestroy @obj
select @response
......
嗯:
exec @hr = sp_OADestroy @obj
Raiserror(@msg, 16, 1)
Return
【讨论】: