Frage

Gibt es eine Möglichkeit, von einer gespeicherten TSQL-Prozedur oder -Funktion einen Webservice aufzurufen?

War es hilfreich?

Lösung

Ja, Sie können so etwas 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

Andere Tipps

Klar, du dürfen, aber das ist eine schreckliche Idee.

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

Zumindest dauert es wahrscheinlich eine halbe Sekunde, bis das XML erstellt und die HTTP-Anfrage an den Remote-Server gesendet wird, der dann das XML analysieren und eine Antwort zurücksenden muss.

  1. Welche Anwendung auch immer ausgeführt hat INSERT INTO BLAH Die Abfrage, die zum Auslösen des Webdienstes geführt hat, muss warten, bis sie abgeschlossen ist.Sofern dies nicht nur im Hintergrund wie bei einer täglich geplanten Aufgabe geschieht, wird die Leistung Ihrer App explodieren

  2. Der den Webdienst aufrufende Code wird im SQL Server ausgeführt und verbraucht dessen Ressourcen.Da das Warten auf die HTTP-Anfrage lange dauert, verbrauchen Sie am Ende viele Ressourcen, was sich wiederum negativ auf die Leistung Ihres Servers auswirkt.

Nicht im T-SQL-Code selbst, aber mit SQL Server 2005 und höher haben sie die Möglichkeit ermöglicht, gespeicherte CLR-Prozeduren zu schreiben, bei denen es sich im Wesentlichen um Funktionen in .NET-Code handelt, und sie dann als gespeicherte Prozeduren zur Verwendung bereitzustellen.Dafür steht Ihnen der Großteil des .NET-Frameworks zur Verfügung, daher kann ich mir vorstellen, dass die Nutzung eines Webdienstes dadurch möglich ist.

Es ist etwas langwierig, hier ausführlich darauf einzugehen, aber hier ist ein Link zu einem MSDN-Artikel zum Thema.

Bei starkem Verkehr oder geschäftskritischen Dingen würde ich dies nicht tun. Wenn Sie jedoch KEIN Feedback von einem Dienst benötigen, ist es tatsächlich eine großartige Sache.

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

  1. Löst das Einfügen und Aktualisieren einer Tabelle aus
  2. Auslöser namens Stored Proc, der die JSON-Daten der Transaktion an einen Web-API-Endpunkt übergibt, der sie dann in eine MongoDB in AWS einfügt.

Machen Sie kein altes XML

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

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

Nicht, dass das alles nach einer anständigen Architektur klingt – aber manchmal muss man verrückte Sachen machen.

Sie können dies mit den eingebetteten VB-Objekten tun.

Zuerst erstellen Sie ein VB-Objekt vom Typ „MSXML2.XMLHttp“ und verwenden dieses eine Objekt für alle Ihre Abfragen (wenn Sie es jedes Mal neu erstellen, müssen Sie mit erheblichen Leistungseinbußen rechnen).

Dann geben Sie dieses Objekt und einige Parameter in eine gespeicherte Prozedur ein, die sp_OAMethod für das Objekt aufruft.

Entschuldigung für das ungenaue Beispiel, aber eine schnelle Google-Suche sollte zeigen, wie die VB-Script-Methode funktioniert.

--

Aber die CLR-Version ist viel ... VIEL einfacher.Das Problem beim Aufruf von Webservices besteht darin, dass diese nicht mit der DB-Engine Schritt halten können.Es treten viele Fehler auf, bei denen es einfach nicht mithalten kann.

Und denken Sie daran, dass Web-DIENSTLEISTUNGEN jedes Mal eine neue Verbindung erfordern.Vielfalt kommt ins Spiel.Sie möchten nicht 5000 Socket-Verbindungen öffnen, um einen Funktionsaufruf für eine Tabelle zu bedienen.Das ist verrückt!

In diesem Fall müssten Sie eine benutzerdefinierte Aggregatfunktion erstellen und DIES als Argument verwenden, um es an Ihren Webservice zu übergeben, der eine Ergebnismenge zurückgeben würde ... dann müssten Sie diese zusammenstellen.Es ist wirklich eine umständliche Art, Daten zu erhalten.

Wenn Sie mit SQL 2000-Kompatibilitätsstufen arbeiten und keine ClR-Integration durchführen können, lesen Sie http://www.vishalseth.com/post/2009/12/22/Call-a-webservice-from-TSQL-(Stored-Procedure)-using-MSXML.aspx

Ich arbeite für große/globale Unternehmen auf der ganzen Welt und verwende Oracle-Datenbanken.Wir verbrauchen ständig Webdienste über die Datenbank mit Store-Prozeduren und es gibt keine Probleme, selbst solche mit starkem Datenverkehr.Alle für den internen Gebrauch, also ohne Internetzugang, nur innerhalb der Anlage.Ich würde empfehlen, es zu verwenden, aber seien Sie sehr vorsichtig bei der Gestaltung

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top