39 Stimmen

Kann man einen Webservice von TSQL-Code aus aufrufen?

Gibt es eine Möglichkeit, aus einer TSQL gespeicherte Prozedur oder Funktion zu einem Webservice aufrufen?

35voto

Kiran.Bakwad Punkte 544

Ja, Sie können wie folgt erstellen

CREATE PROCEDURE CALLWEBSERVICE(@Para1 ,@Para2)
AS
BEGIN
    Declare @Object as Int;
    Declare @ResponseText as Varchar(8000);

    Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
    Exec sp_OAMethod @Object, 'open', NULL, 'get', 'http://www.webservicex.com/stockquote.asmx/GetQuote?symbol=MSFT','false'
    Exec sp_OAMethod @Object, 'send'
    Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT
    Select @ResponseText
    Exec sp_OADestroy @Object
END

25voto

Orion Edwards Punkte 117361

Sicherlich peut aber das ist eine schreckliche Idee.

Da Web-Service-Aufrufe beliebig lange dauern und zufällig fehlschlagen können, je nachdem, wie viele Partien Counterstrike gerade in Ihrem Netzwerk gespielt werden, können Sie nicht sagen, wie lange dies dauern wird.

Es dauert mindestens eine halbe Sekunde, bis der XML-Code erstellt ist, die HTTP-Anfrage an den entfernten Server gesendet wird, der dann den XML-Code parsen und eine Antwort zurücksenden muss.

  1. Welche Anwendung auch immer die INSERT INTO BLAH Abfrage, die den Webdienst ausgelöst hat, muss warten, bis sie beendet ist. Sofern es sich nicht um etwas handelt, das nur im Hintergrund abläuft, wie z. B. eine täglich geplante Aufgabe, wird die Leistung Ihrer Anwendung in den Keller gehen

  2. Der Code, der den Webdienst aufruft, wird im SQL-Server ausgeführt und verbraucht dessen Ressourcen. Da es lange dauert, auf die HTTP-Anfrage zu warten, verbrauchen Sie am Ende eine Menge Ressourcen, was wiederum die Leistung Ihres Servers beeinträchtigt.

10voto

Dillie-O Punkte 28749

Nicht im T-SQL-Code selbst, aber mit SQL Server 2005 und höher wurde die Möglichkeit geschaffen, CLR Stored Procedures zu schreiben, die im Wesentlichen Funktionen im .NET-Code sind und dann als Stored Procedures für den Verbrauch bereitgestellt werden. Hierfür steht der größte Teil des .NET-Frameworks zur Verfügung, so dass ich mir vorstellen kann, dass die Nutzung eines Webdienstes auf diese Weise möglich ist.

Es ist etwas zu langwierig, um es hier im Detail zu besprechen, aber hier ist ein Link zu einem MSDN-Artikel zu diesem Thema.

8voto

Tom Stickel Punkte 18167

Ich würde dies nicht bei starkem Datenverkehr oder geschäftskritischem Material tun, ABER wenn Sie KEIN Feedback von einem Dienst benötigen, dann ist es eine großartige Sache, die man tun kann.

Hier ist ein Beispiel dafür, was ich getan habe.

  1. Auslöser Einfügen und Aktualisieren in einer Tabelle
  2. Trigger namens Stored Proc, der die JSON-Daten der Transaktion an einen Web Api Endpoint weitergibt, der dann in eine MongoDB in AWS einfügt.

Kein altes XML verwenden

JSON

EXEC sp_OACreate 'WinHttp.WinHttpRequest.5.1', @Object OUT;
EXEC sp_OAMethod @Object, 'Open', NULL, 'POST', 'http://server/api/method', 'false'
EXEC sp_OAMethod @Object, 'setRequestHeader', null, 'Content-Type', 'application/json'
DECLARE @len INT = len(@requestBody) 

Vollständiges Beispiel:

Alter Procedure yoursprocname

 @WavName varchar(50),
 @Dnis char(4) 

    AS
BEGIN

    SET NOCOUNT ON;

DECLARE @Object INT;
DECLARE @Status INT;

DECLARE @requestBody NVARCHAR(MAX) = '{
"WavName": "{WavName}",
"Dnis": "{Dnis}"
}'

SET @requestBody = REPLACE(@requestBody, '{WavName}', @WavName)
SET @requestBody = REPLACE(@requestBody, '{Dnis}', @Dnis)

EXEC sp_OACreate 'WinHttp.WinHttpRequest.5.1', @Object OUT;
EXEC sp_OAMethod @Object, 'Open', NULL, 'POST',  'http://server/api/method', 'false'
EXEC sp_OAMethod @Object, 'setRequestHeader', null, 'Content-Type', 'application/json'
DECLARE @len INT = len(@requestBody) 
EXEC sp_OAMethod @Object, 'setRequestHeader', null, 'Content-Length', @len
EXEC sp_OAMethod @Object, 'send', null, @requestBody
EXEC sp_OAGetProperty @Object, 'Status', @Status OUT
EXEC sp_OADestroy @Object

3voto

Mark Brackett Punkte 83046

In früheren Versionen von Sql konnten Sie entweder einen erweiterten Stored Proc oder xp_cmdshell verwenden, um einen Webservice aufzurufen.

Das klingt zwar nicht nach einer guten Architektur, aber manchmal muss man auch verrückte Dinge tun.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X