有没有办法从TSQL存储过程或函数调用web服务?你可以从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
不能在T-SQL代码本身,而是与SQL Server 2005及以上,他们已经启用写CLR存储过程,其本质上是在.NET代码的功能,然后将它们公开为消费存储过程的能力。为此,您可以使用.NET框架的大部分功能,因此通过此功能可以看到Web服务的消耗。
这是一个有点冗长在这里详细讨论,但这里有一个MSDN article链路上的话题。
在早期版本的Sql中,您可以使用扩展存储过程或xp_cmdshell来调出Web服务。
不是说这些听起来像一个体面的建筑 - 但有时你必须做疯狂的狗屎。
当然你可以,但是这是一个可怕的想法。
由于网络服务调用可能会花费任意数量的时间,并且随机失败,这取决于当时在您的网络上正在播放的反击次数有多少次,因此无法判断这需要多长时间。
在最低限度,你看大概半秒由它生成的XML时,将HTTP请求发送到远程服务器,然后有解析XML,并发送回一个响应。
任何应用程序做这引起了网络服务,以火
INSERT INTO BLAH
查询将不得不等待它完成。除非这是仅在背景中发生的事情,例如每天计划的任务,否则应用程序的性能将会弹出Web服务调用代码在SQL服务器内运行,并使用它的资源。由于等待HTTP请求需要很长时间,您最终会耗尽大量资源,这将再次损害服务器的性能。
+1“取决于反击次数是多少次ng在您的网络上播放“,并为您提供良好的答案。 ;) – 2010-04-15 14:03:21
如果你要说它可以完成,你应该解释如何。 – 2016-05-12 13:35:34
下面的响应者说得非常好(在提供了一些有用的线索之后):“不是说这些听起来像一个体面的建筑 - 但有时你必须做疯狂的狗屎”。 – wunth 2017-09-05 21:00:38
一致认为它不是想做的事情,但有时你必须做你不理想的事情。在这种情况下,我最终将Web服务函数重写为一个SQL函数来完成相同的任务。
感谢您的所有链接和建议。
你可以用嵌入的VB对象来做到这一点。
首先,您创建一个类型为'MSXML2.XMLHttp'的VB对象,并且您使用这一个对象来处理所有查询(如果每次都需要重新执行该对象,那么期望得到较高的性能损失)。
然后,将该对象(某些参数)提供给在对象上调用sp_OAMethod的存储过程。
对不起,我们的快速谷歌搜索应该揭示vb脚本方法是如何完成的。
-
但是,CLR版本是... ...更容易。 调用webservices的问题在于它们无法跟上数据库引擎的步伐。你会得到很多错误,它跟不上。
记住,Web服务需要每次一个新的连接。多样性发挥作用。您不想打开5000个套接字连接来为表上的函数调用提供服务。这很疯狂!
在你必须创建一个自定义聚合函数,并用它作为参数传递给你的web服务,这将返回结果集...那么你就必须整理是这种情况。它真的是一个尴尬的获取数据的方式。
需要注意的是,使用嵌入式CLR往往会比使用OLE对象执行更多,*更多*,**更多**。我有一些小的CLR函数,由于客户端原因必须转换为调用OLE。一旦发生这种情况,就会造成巨大的性能损失。为了所有的意图和目的,返回的CLR函数立即突然花费了几乎一秒的时间才能返回。 – eidylon 2014-08-11 16:54:20
如果你使用SQL 2000兼容级别的工作,不能做CLR集成,请参阅http://www.vishalseth.com/post/2009/12/22/Call-a-webservice-from-TSQL-(Stored-Procedure)-using-MSXML.aspx
我不会为交通繁忙或任务做到这一点关键的东西,但是,如果你不需要从服务中获得反馈,那么它实际上是一件好事。
这是我所做的一个例子。
-
上表
- 触发器插入和更新触发器调用存储过程是交易的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
- 1. C#Web服务可以调用其他DLL代码吗?
- 2. 我可以使用customErrors调用服务器端代码吗?
- 3. 我可以从Java脚本调用Web服务吗?
- 4. 我可以从我的Axis2 Web服务调用Hadoop API吗?
- 5. 我可以从SQL Server 2005调用Web服务吗?
- 6. 从iPhone可以同时调用多个Web服务吗?
- 7. 你可以在Web服务引用上使用城堡动态代理吗?
- 8. 服务可以在其代码中调用另一个服务吗?
- 9. Web服务调用客户端代码
- 10. ColdFusion代码调用.NET Web服务
- 11. Can Django可以用于Web服务吗?
- 12. Jax-WS - 当实现Web服务时,你可以调用另一个Web服务,比如调用任何pojo?
- 13. Force Apex应用程序可以调用外部Web服务吗?
- 14. 从TSQL存储过程调用SOAP web服务
- 15. 从TSQL调用Web服务的最佳方式
- 16. 你可以从相同的UserControls Javascript中调用UserControl服务器功能吗?
- 17. Can PhantomJS page.open可以调用Web服务吗?
- 18. 工作日可以调用外部Web服务吗?
- 19. 我可以作为HTTP请求调用Web服务吗?
- 20. 调用Web服务时,Prism可以模块化吗?
- 21. Map Reduce的Map函数可以调用(外部)Web服务吗?
- 22. 我可以创建Web服务来调用Servlets吗?
- 23. Python应用程序:你可以保护你的代码吗?
- 24. Web服务可以与其他Web服务交谈吗?
- 25. 调用使用Axis从PHP代码创建的Java Web服务
- 26. Web服务可以在同一个应用程序服务器中调用另一个Web服务吗?
- 27. C#可以调用球拍代码吗?
- 28. C++可以调用Java代码吗?
- 29. 我可以从Windows Mobile应用程序调用REST Web服务吗
- 30. 可以使用任何库从iOS平台调用轴web服务吗?
我还可以添加更近(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