2008-08-28 36 views

回答

10

是的,你可以创建一个这样

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 
9

不能在T-SQL代码本身,而是与SQL Server 2005及以上,他们已经启用写CLR存储过程,其本质上是在.NET代码的功能,然后将它们公开为消费存储过程的能力。为此,您可以使用.NET框架的大部分功能,因此通过此功能可以看到Web服务的消耗。

这是一个有点冗长在这里详细讨论,但这里有一个MSDN article链路上的话题。

+0

我还可以添加更近(2009年5月)关于这个问题的文章:HTTP ://www.databasejournal.com/features/mssql/article.php/3821271/Calling-a-Web-Service-from-within-SQL-Server.htm – 2010-04-15 15:23:56

3

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

不是说这些听起来像一个体面的建筑 - 但有时你必须做疯狂的狗屎。

18

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

由于网络服务调用可能会花费任意数量的时间,并且随机失败,这取决于当时在您的网络上正在播放的反击次数有多少次,因此无法判断这需要多长时间。

在最低限度,你看大概半秒由它生成的XML时,将HTTP请求发送到远程服务器,然后有解析XML,并发送回一个响应。

  1. 任何应用程序做这引起了网络服务,以火INSERT INTO BLAH查询将不得不等待它完成。除非这是仅在背景中发生的事情,例如每天计划的任务,否则应用程序的性能将会弹出

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

+6

+1“取决于反击次数是多少次ng在您的网络上播放“,并为您提供良好的答案。 ;) – 2010-04-15 14:03:21

+4

如果你要说它可以完成,你应该解释如何。 – 2016-05-12 13:35:34

+1

下面的响应者说得非常好(在提供了一些有用的线索之后):“不是说这些听起来像一个体面的建筑 - 但有时你必须做疯狂的狗屎”。 – wunth 2017-09-05 21:00:38

0

一致认为它不是想做的事情,但有时你必须做你不理想的事情。在这种情况下,我最终将Web服务函数重写为一个SQL函数来完成相同的任务。

感谢您的所有链接和建议。

2

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

首先,您创建一个类型为'MSXML2.XMLHttp'的VB对象,并且您使用这一个对象来处理所有查询(如果每次都需要重新执行该对象,那么期望得到较高的性能损失)。

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

对不起,我们的快速谷歌搜索应该揭示vb脚本方法是如何完成的。

-

但是,CLR版本是... ...更容易。 调用webservices的问题在于它们无法跟上数据库引擎的步伐。你会得到很多错误,它跟不上。

记住,Web服务需要每次一个新的连接。多样性发挥作用。您不想打开5000个套接字连接来为表上的函数调用提供服务。这很疯狂!

在你必须创建一个自定义聚合函数,并用它作为参数传递给你的web服务,这将返回结果集...那么你就必须整理是这种情况。它真的是一个尴尬的获取数据的方式。

+0

需要注意的是,使用嵌入式CLR往往会比使用OLE对象执行更多,*更多*,**更多**。我有一些小的CLR函数,由于客户端原因必须转换为调用OLE。一旦发生这种情况,就会造成巨大的性能损失。为了所有的意图和目的,返回的CLR函数立即突然花费了几乎一秒的时间才能返回。 – eidylon 2014-08-11 16:54:20

4

我不会为交通繁忙或任务做到这一点关键的东西,但是,如果你不需要从服务中获得反馈,那么它实际上是一件好事。

这是我所做的一个例子。

    上表
  1. 触发器插入和更新触发器调用存储过程是交易的JSON数据传送到网络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 
相关问题