当前位置:  开发笔记 > 前端 > 正文

你能用TSQL代码调用web服务吗?

如何解决《你能用TSQL代码调用web服务吗?》经验,为你挑选了4个好方法。

有没有办法从TSQL存储过程或函数调用到Web服务?



1> 小智..:

是的,你可以像这样创建

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



2> Orion Edward..:

当然可以,但这是一个可怕的想法.

由于网络服务呼叫可能需要花费任意时间,并且随机失败,这取决于当时网络上正在播放的反击游戏数量,您无法确定这需要多长时间.

在构建XML时,您至少可以查看半秒钟,将HTTP请求发送到远程服务器,然后远程服务器必须解析XML并发回响应.

    无论哪个应用程序执行INSERT INTO BLAH导致Web服务触发的查询都必须等待它完成.除非这只是在背景中发生的事情,就像日常计划任务一样,否则你的应用程序的性能将会爆炸

    Web服务调用代码在SQL服务器内运行,并耗尽它的资源.由于等待HTTP请求需要很长时间,因此最终会耗尽大量资源,这将再次损害服务器的性能.


+1"取决于当时在您的网络上播放了多少次反击游戏",并获得了良好的答案.;)
如果你要说可以做到,你应该解释一下.

3> Dillie-O..:

不是在T-SQL代码本身,而是在SQL Server 2005及更高版本中,它们启用了编写CLR存储过程的能力,CLR存储过程本质上是.NET代码中的函数,然后将它们作为存储过程公开以供使用.您可以轻松获得大部分.NET框架,因此我可以通过此方式看到Web服务的消费.

这里详细讨论有点冗长,但这里有关于该主题的MSDN文章的链接.



4> Tom Stickel..:

对于流量大或任务关键的事情,我不会这样做,但是,如果您不需要收到服务的反馈,那么实际上这是一件很棒的事情。

这是我所做的一个例子。

    触发表上的插入和更新

    名为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

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有