SQL Server可以发送Web请求吗?

时间:2011-05-12 19:46:43

标签: sql sql-server sql-server-2005 tsql

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

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

INTERNET网络应用程序设置了一个RESTful api,可以通过表单发送到公共可访问的URL(例如http://www.example.com/records/new)。

有没有人知道通过网址发送数据(网址中的xml,json,纯变量)是否可以在SQL Server中完成?

感谢您的任何想法!

4 个答案:

答案 0 :(得分:13)

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

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

解决方案是通过队列将触发器与HTTP请求分离。触发器将请求排入本地队列并进行提交,而单独的处理会使这些请求出列并发出HTTP请求。这解决了上面提到的两个问题。您可以将普通表用于队列(请参阅Using Tables as Queues),也可以使用Service Broker,这两种方法都可以使用。

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

答案 1 :(得分:7)

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

例如,搜索“SQL CLR WebRequest”或“SQL CLR WCF”。

答案 2 :(得分:1)

首先执行以下操作

sp_configure 'show advanced options', 1;
go
RECONFIGURE;
go
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO

然后创建一个函数

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

使用像:

select dbo.GetHttp('http://127.0.0.1/mywebpage.php')

答案 3 :(得分:1)

您可以尝试使用CLR存储过程SQL-APIConsumer

它具有多个过程,可让您调用仅需要参数的简单API,甚至可以传递多个标头和令牌身份验证。

enter image description here

enter image description here