Gibt es eine Möglichkeit, aus einer TSQL gespeicherte Prozedur oder Funktion zu einem Webservice aufrufen?
Antworten
Zu viele Anzeigen?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
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.
-
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 -
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.
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.
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.
- Auslöser Einfügen und Aktualisieren in einer Tabelle
- 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
- See previous answers
- Weitere Antworten anzeigen