Can SQL Server send a web request?

后端 未结 4 1017
南旧
南旧 2020-12-01 12:34

I have an SQL Server database and an intranet web application on a local network. The intranet web application creates records and sends them to the database. I have an Inte

相关标签:
4条回答
  • 2020-12-01 13:11

    As a good (rather reliable and scalable) option, you can use SQL CLR to interact with web application / web service.

    For example, search for "SQL CLR WebRequest" or "SQL CLR WCF".

    0 讨论(0)
  • 2020-12-01 13:21

    First do The follow

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

    Then Create a function

    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
    

    use like:

    select dbo.GetHttp('http://127.0.0.1/mywebpage.php')
    
    0 讨论(0)
  • 2020-12-01 13:21

    You could try using this CLR Stored procedure SQL-APIConsumer.

    It has multiple procedures that allows you calling simples API that only required a parameters or even passing multiples headers and tokens authentications.

    0 讨论(0)
  • 2020-12-01 13:25

    It is possible, but in the real world is a little bit more complicated than the naive approach you envision. Primarily, it is unacceptable to have a trigger wait for a HTTP request:

    • For one, your application will crawl to a screeching halt, because triggers will block resources (primarily locks) waiting for a response from some far and away WWW service.
    • Second, more subtle but far worse, is the issue of correctness in presence of rollbacks. If the transaction that issued to HTTP requests rolls back, there is no way to 'undo' the HTTP request.

    The solution is to decouple the trigger from the HTTP request via a queue. The trigger enqueues the request into a local queue and commits, while a separate piece of processing dequeues these requests and issues the HTTP request. This solves both problems pointed out above. You can use ordinary tables for queues (see Using Tables as Queues) or you can use Service Broker, both work well.

    Now on how to dequeue this requests and actually place the HTTP call, I strongly recommend using a dedicated process (ie. an application dedicated for this purpose). While it is possible to use SQLCLR, it is a very bad choice. SQL Server resources (specifically workers) are far to precious to waste on waiting for Internet responses.

    0 讨论(0)
提交回复
热议问题