39

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

4

9 回答 9

34

是的,你可以这样创作

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
于 2015-05-13T10:10:37.813 回答
26

当然可以,但这是一个糟糕的主意。

由于 Web 服务调用可能需要任意时间,并且随机失败,具体取决于当时在您的网络上玩了多少反击游戏,您无法判断这需要多长时间。

在它构建 XML、将 HTTP 请求发送到远程服务器时,您至少需要等待半秒,然后远程服务器必须解析 XML 并返回响应。

  1. 无论哪个应用程序执行了INSERT INTO BLAH导致 Web 服务触发的查询,都必须等待它完成。除非这是仅在后台发生的事情,例如每日计划任务,否则您的应用程序的性能将会爆炸

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

于 2008-08-29T02:46:26.557 回答
10

不是在 T-SQL 代码本身中,而是在 SQL Server 2005 及更高版本中,他们启用了编写 CLR 存储过程的能力,这些存储过程本质上是 .NET 代码中的函数,然后将它们公开为存储过程以供使用。大部分 .NET 框架都触手可及,因此我可以看到通过它可以使用 Web 服务。

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

于 2008-08-28T21:34:57.773 回答
8

我不会为繁忙的交通或关键任务的东西这样做,但是,如果您不需要从服务接收反馈,那么这实际上是一件很棒的事情。

这是我所做的一个例子。

  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) 

完整示例:

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
于 2017-05-16T05:37:50.687 回答
3

在早期版本的 Sql 中,您可以使用扩展存储过程或 xp_cmdshell 来调用 Web 服务。

并不是说这些听起来都像是一个不错的架构——但有时你必须做一些疯狂的事情。

于 2008-08-29T01:53:55.157 回答
2

您可以使用嵌入的 VB 对象来做到这一点。

首先,您创建一个“MSXML2.XMLHttp”类型的 VB 对象,然后将这个对象用于所有查询(如果您每次都重新创建它,预计会造成严重的性能损失)。

然后,将该对象(一些参数)提供给调用该对象的 sp_OAMethod 的存储过程。

抱歉这个不精确的例子,但是一个快速的谷歌搜索应该会揭示 vb-script 方法是如何完成的。

--

但是 CLR 版本要简单得多....要容易得多。调用 web 服务的问题在于它们无法跟上数据库引擎的步伐。你会得到很多它无法跟上的错误。

请记住,网络服务每次都需要一个新的连接。多样性开始发挥作用。您不想打开 5000 个套接字连接来为表上的函数调用提供服务。那是疯子!

在这种情况下,您必须创建一个自定义聚合函数,并将其用作传递给您的 Web 服务的参数,这将返回一个结果集……然后您必须对其进行整理。它确实是一种获取数据的尴尬方式。

于 2009-12-22T17:04:20.100 回答
2

这是一个从 Web 服务获取一些数据的示例。在这种情况下,将用户代理字符串解析为 JSON。

--first configure MSSQL to enable calling out to a webservice (1=true, 0=false)
sp_configure 'show advanced options', 1;  
GO  
RECONFIGURE;  
GO  
sp_configure 'Ole Automation Procedures', 1;  
GO  
RECONFIGURE;  
GO  

CREATE PROCEDURE CallWebAPI_ParseUserAgent @UserAgent VARCHAR(512)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @Object INT;
    DECLARE @ResponseText AS VARCHAR(8000);
    DECLARE @url VARCHAR(512)

    SET @url = 'http://www.useragentstring.com/?getJSON=all&uas=' + @UserAgent;

    EXEC sp_OACreate 'WinHttp.WinHttpRequest.5.1', @Object OUT;
    EXEC sp_OAMethod @Object, 'Open', NULL, 'GET', @url, 'false'
    EXEC sp_OAMethod @Object, 'setRequestHeader', NULL, 'Content-Type', 'application/json'
    EXEC sp_OAMethod @Object, 'send'
    EXEC sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT
    SELECT @ResponseText
    EXEC sp_OADestroy @Object
END

--example how to call the API
CallWebAPI_ParseUserAgent 'Mozilla/5.0 (Windows NT 6.2; rv:53.0) Gecko/20100101 Firefox/53.0'
于 2019-11-26T08:14:44.150 回答
1

如果您使用 sql 2000 兼容级别并且无法进行 clr 集成,请参阅http://www.vishalseth.com/post/2009/12/22/Call-a-webservice-from-TSQL-(Stored-Procedure) -使用-MSXML.aspx

于 2009-12-23T20:53:34.380 回答
1

我一直在使用 Oracle 数据库为世界各地的大型/全球公司工作。我们一直在通过带有存储过程的数据库使用 Web 服务,并且没有任何问题,即使是那些流量很大的。所有这些都供内部使用,我的意思是无法访问互联网,只能在工厂内部使用。我会建议使用它,但要非常小心你如何设计它

于 2019-01-11T15:46:18.160 回答