有没有办法从TSQL存储过程或函数调用到Web服务?
是的,你可以像这样创建
CREATE PROCEDURE CALLWEBSERVICE(@Para1 ,@Para2) AS BEGIN Declare @Object as Int; Declare @ResponseText as Varchar(8000); Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT; Exec sp_OAMethod @Object, 'open', NULL, 'get', 'http://www.webservicex.com/stockquote.asmx/GetQuote?symbol=MSFT','false' Exec sp_OAMethod @Object, 'send' Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT Select @ResponseText Exec sp_OADestroy @Object END
当然可以,但这是一个可怕的想法.
由于网络服务呼叫可能需要花费任意时间,并且随机失败,这取决于当时网络上正在播放的反击游戏数量,您无法确定这需要多长时间.
在构建XML时,您至少可以查看半秒钟,将HTTP请求发送到远程服务器,然后远程服务器必须解析XML并发回响应.
无论哪个应用程序执行INSERT INTO BLAH
导致Web服务触发的查询都必须等待它完成.除非这只是在背景中发生的事情,就像日常计划任务一样,否则你的应用程序的性能将会爆炸
Web服务调用代码在SQL服务器内运行,并耗尽它的资源.由于等待HTTP请求需要很长时间,因此最终会耗尽大量资源,这将再次损害服务器的性能.
不是在T-SQL代码本身,而是在SQL Server 2005及更高版本中,它们启用了编写CLR存储过程的能力,CLR存储过程本质上是.NET代码中的函数,然后将它们作为存储过程公开以供使用.您可以轻松获得大部分.NET框架,因此我可以通过此方式看到Web服务的消费.
这里详细讨论有点冗长,但这里有关于该主题的MSDN文章的链接.
对于流量大或任务关键的事情,我不会这样做,但是,如果您不需要收到服务的反馈,那么实际上这是一件很棒的事情。
这是我所做的一个例子。
触发表上的插入和更新
名为Stored Proc的触发器将事务的JSON数据传递到Web Api端点,然后将其插入AWS的MongoDB中。
不要做旧的XML
JSON格式
EXEC sp_OACreate 'WinHttp.WinHttpRequest.5.1', @Object OUT; EXEC sp_OAMethod @Object, 'Open', NULL, 'POST', 'http://server/api/method', 'false' EXEC sp_OAMethod @Object, 'setRequestHeader', null, 'Content-Type', 'application/json' DECLARE @len INT = len(@requestBody)
完整示例:
Alter Procedure yoursprocname @WavName varchar(50), @Dnis char(4) AS BEGIN SET NOCOUNT ON; DECLARE @Object INT; DECLARE @Status INT; DECLARE @requestBody NVARCHAR(MAX) = '{ "WavName": "{WavName}", "Dnis": "{Dnis}" }' SET @requestBody = REPLACE(@requestBody, '{WavName}', @WavName) SET @requestBody = REPLACE(@requestBody, '{Dnis}', @Dnis) EXEC sp_OACreate 'WinHttp.WinHttpRequest.5.1', @Object OUT; EXEC sp_OAMethod @Object, 'Open', NULL, 'POST', 'http://server/api/method', 'false' EXEC sp_OAMethod @Object, 'setRequestHeader', null, 'Content-Type', 'application/json' DECLARE @len INT = len(@requestBody) EXEC sp_OAMethod @Object, 'setRequestHeader', null, 'Content-Length', @len EXEC sp_OAMethod @Object, 'send', null, @requestBody EXEC sp_OAGetProperty @Object, 'Status', @Status OUT EXEC sp_OADestroy @Object