SQL Server可以发送Web请求吗?

Leh*_*hez 17 sql t-sql sql-server sql-server-2005

我在本地网络上有一个SQL Server数据库和一个Intranet Web应用程序.Intranet Web应用程序创建记录并将它们发送到数据库.我有一个Internet Web应用程序,我想在本地网络上使用SQL Server数据库发送新记录.

我无法出于各种原因更改/修改Intranet Web应用程序,因此我唯一的选择是在本地SQL Server上创建一个触发器,该触发器将使用某种http post请求或url调用将新记录发送到Internet Web应用程序.

INTERNET Web应用程序设置有RESTful api,可以通过表单发布到公共可访问的URL(例如http://www.example.com/records/new)接收新记录.

有没有人知道如果通过URL发送数据(xml,json,纯文本变量)可以在SQL Server中完成?

谢谢你的任何想法!

Rem*_*anu 13

这是可能的,但在现实世界中,比你想象的天真方法要复杂一点.首先,让触发器等待HTTP请求是不可接受的:

  • 首先,您的应用程序将爬行到尖锐停止,因为触发器将阻止资源(主要是锁定)等待来自远程WWW服务的响应.
  • 第二,更微妙但更糟糕的是存在回滚的正确性问题.如果发出给HTTP请求的事务回滚,则无法"撤消"HTTP请求.

解决方案是通过队列将触发器与HTTP请求分离.触发器将请求排入本地队列并进行提交,而单独的处理会使这些请求出列并发出HTTP请求.这解决了上面提到的两个问题.您可以将普通表用于队列(请参阅使用表作为队列),或者您可以使用Service Broker,两者都运行良好.

现在关于如何将这些请求出列并实际放置HTTP调用,我强烈建议使用专用进程(即专用于此目的的应用程序).虽然可以使用SQLCLR,但这是一个非常糟糕的选择.SQL Server资源(特别是工作者)在等待Internet响应时浪费很多.

  • 关于 SQL CLR 的最新建议在过去 10 年里有什么变化吗? (2认同)

aba*_*hev 7

作为一个优秀(相当可靠和可扩展)的选项,您可以使用SQL CLR与Web应用程序/ Web服务进行交互.

例如,SQL CLR WebRequestSQL CLR WCF.


del*_*ive 5

首先执行以下操作

sp_configure 'show advanced options', 1;
go
RECONFIGURE;
go
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
Run Code Online (Sandbox Code Playgroud)

然后创建一个函数

create function GetHttp
(
    @url varchar(8000)      
)
returns varchar(8000)
as
BEGIN
    DECLARE @win int 
    DECLARE @hr  int 
    DECLARE @text varchar(8000)

    EXEC @hr=sp_OACreate 'WinHttp.WinHttpRequest.5.1',@win OUT 
    IF @hr <> 0 EXEC sp_OAGetErrorInfo @win

    EXEC @hr=sp_OAMethod @win, 'Open',NULL,'GET',@url,'false'
    IF @hr <> 0 EXEC sp_OAGetErrorInfo @win

    EXEC @hr=sp_OAMethod @win,'Send'
    IF @hr <> 0 EXEC sp_OAGetErrorInfo @win

    EXEC @hr=sp_OAGetProperty @win,'ResponseText',@text OUTPUT
    IF @hr <> 0 EXEC sp_OAGetErrorInfo @win

    EXEC @hr=sp_OADestroy @win 
    IF @hr <> 0 EXEC sp_OAGetErrorInfo @win 

    RETURN @text
END
Run Code Online (Sandbox Code Playgroud)

使用如下:

select dbo.GetHttp('http://127.0.0.1/mywebpage.php')
Run Code Online (Sandbox Code Playgroud)