有没有一种方法可以从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
当然你可以,但这是一个可怕的想法。
由于web服务调用可能需要任意长的时间,并且会随机失败,这取决于你的网络上同时进行了多少盘反恐精英游戏,所以你无法确定这需要多长时间。
最起码,构建XML、发送HTTP请求到远程服务器,然后解析XML并发送响应需要半秒钟左右。
引发web服务的INSERT INTO BLAH
查询的应用程序将不得不等待其完成。除非这只是类似每日计划任务的后台操作,否则您的应用程序性能将受到影响。
web服务调用代码在SQL服务器内部运行,并使用它的资源。由于要等待HTTP请求很长时间,因此您将使用大量资源,这将再次损害服务器的性能。
虽然T-SQL代码本身不支持,但使用SQL Server 2005及以上版本,可以编写CLR存储过程。CLR存储过程实质上是.NET代码中的函数,并将其公开为可用的存储过程。您可以在此过程中轻松访问大部分.NET框架,因此我可以看到可以通过此方法消费Web服务。
这里不方便详细讨论,但以下链接是关于该主题的MSDN文章。
对于高流量或关键任务,我不会这样做。但是,如果您不需要从服务接收反馈,则实际上这是一件好事。
以下是我所做的一个示例。
不要使用旧的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
Exec sp_OADestroy @Object
。 - TheEmirOfGroofunkistansp_OA*
调用。 - Tom Stickel在早期版本的Sql中,您可以使用扩展存储过程或xp_cmdshell来外壳并调用Web服务。
虽然这两种方法都不像一个体面的架构 - 但有时您必须做一些疯狂的事情。
--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'