我在本地网络上有一个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中完成?
感谢您的任何想法!
答案 0 :(得分:13)
这是可能的,但在现实世界中,比你想象的天真方法要复杂一点。主要是,让触发器等待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)