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

The*_*tan 36 t-sql sql-server web-services

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

小智 30

是的,你可以像这样创建

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
Run Code Online (Sandbox Code Playgroud)

  • 如何调用https服务? (2认同)

Ori*_*rds 26

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

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

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

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

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

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

Dil*_*e-O 10

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

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


Tom*_*kel 5

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

这是我所做的一个例子。

  1. 触发表上的插入和更新
  2. 名为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) 
Run Code Online (Sandbox Code Playgroud)

完整示例:

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
Run Code Online (Sandbox Code Playgroud)