Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server能否发送web请求?_Sql_Sql Server_Sql Server 2005_Tsql - Fatal编程技术网

SQL Server能否发送web请求?

SQL Server能否发送web请求?,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,我在本地网络上有一个SQL Server数据库和一个intranet web应用程序。intranet web应用程序创建记录并将其发送到数据库。我有一个Internet web应用程序,我想使用本地网络上的SQL Server数据库将新记录发送到该应用程序 由于各种原因,我无法更改/修改intranet web应用程序,因此我唯一的选择是在本地SQL Server上创建一个触发器,该触发器将使用某种http post请求或url调用向Internet web应用程序发送新记录 INTERNET

我在本地网络上有一个SQL Server数据库和一个intranet web应用程序。intranet web应用程序创建记录并将其发送到数据库。我有一个Internet web应用程序,我想使用本地网络上的SQL Server数据库将新记录发送到该应用程序

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

INTERNET web应用程序使用RESTful api进行设置,该api可以通过向公共可访问url(例如)发送表单来接收新记录

有人知道通过url发送数据(xml、json、url中的普通变量)是否可以在SQL Server中完成吗

谢谢你的任何想法

作为一个好的(相当可靠和可扩展)选项,您可以使用与web应用程序/web服务交互


例如,搜索“”或“”。

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

  • 首先,您的应用程序将爬行到急停状态,因为触发器将阻止资源(主要是锁)等待来自某个遥远的WWW服务的响应
  • 第二,更微妙但更糟糕的是,存在回滚时的正确性问题。如果向HTTP请求发出的事务回滚,则无法“撤消”HTTP请求
解决方案是通过队列将触发器与HTTP请求分离。触发器将请求排队到本地队列并提交,而单独的处理将这些请求排队并发出HTTP请求。这解决了上述两个问题。您可以将普通表用于队列(请参阅),也可以使用,两者都可以很好地工作

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

首先执行以下操作

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

您可以尝试使用此CLR存储过程

它有多个过程,允许您调用仅需要参数的SimplesAPI,甚至可以传递多个标头和令牌身份验证


或SSIS-集成服务。@marc\s:根据我不太熟悉的经验,SSIS是一个更复杂的主题SQLCLR@marc_s同样,使用SSI,您最终不得不编写C#,因为它通常不够灵活。我不会等待http请求。我希望触发器启动http请求。我希望触发器在更新新记录时调用url。我不需要它等待响应或类似的东西,但是触发器将等待http请求。触发器将在插入/更新时执行,只有当触发器完成执行时,插入/更新才会完成并“完成”插入/更新过程。这一切都是同步发生的。触发器应尽可能少且快。如果可能,除了将审核类型数据转储到另一个表之外,不要使用触发器。
select dbo.GetHttp('http://127.0.0.1/mywebpage.php')