Czy można wywołać webservice z kodu TSQL?

Czy istnieje sposób na wywołanie z procedury składowanej lub funkcji TSQL do webservice?

Author: TheEmirOfGroofunkistan, 2008-08-29

8 answers

Tak, możesz tworzyć w ten sposób

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
 19
Author: Kiran.Bakwad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-13 10:26:55

Oczywiście, że możesz, ale to okropny pomysł.

Ponieważ połączenia z serwisem internetowym mogą zająć dowolne ilości czasu i losowo nie powiodą się, w zależności od tego, ile gier counterstrike jest odtwarzanych w Twojej sieci w tym czasie, nie możesz powiedzieć, jak długo to potrwa.

Na minimum, na które patrzysz prawdopodobnie pół sekundy, zanim zbuduje XML, wysyła żądanie HTTP do zdalnego serwera, który następnie musi przeanalizować XML i wysłać odpowiedź do tyłu.

  1. Niezależnie od tego, która aplikacja wykonała zapytanie INSERT INTO BLAH, które spowodowało odpalenie usługi internetowej, będzie musiała poczekać na jej zakończenie. Jeśli nie jest to coś, co dzieje się tylko w tle, jak codzienne zaplanowane zadanie, wydajność aplikacji będzie bomba

  2. Kod wywołujący usługę WWW działa wewnątrz serwera SQL i wykorzystuje jego zasoby. Ponieważ długo potrwa oczekiwanie na żądanie HTTP, w końcu wykorzystasz wiele zasobów, które ponownie zaszkodzi wydajności serwera.

 20
Author: Orion Edwards,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-01 20:33:42

Nie w samym kodzie T-SQL, ale w SQL Server 2005 i nowszych, umożliwiły zapisywanie procedur przechowywanych CLR, które są zasadniczo funkcjami w kodzie. NET, a następnie udostępniają je jako procedury przechowywane do użytku. Masz większość. NET framework na wyciągnięcie ręki do tego, więc widzę zużycie usługi internetowej możliwe dzięki temu.

Jest to trochę długie do szczegółowego omówienia tutaj, ale tutaj jest link do artykuł MSDN na ten temat.

 9
Author: Dillie-O,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-28 21:34:57

Nie robiłbym tego dla dużego ruchu lub krytycznych rzeczy, jednak jeśli nie musisz otrzymywać informacji zwrotnych od usługi, to jest to naprawdę świetna rzecz do zrobienia.

Oto przykład tego, co zrobiłem.
  1. wyzwalacze Insert i Update na Tabeli
  2. WYZWALACZ o nazwie Stored Proc, który przekazuje dane JSON transakcji do punktu końcowego API sieci Web, który następnie wstawia się do MongoDB w AWS.

Nie rób starego 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) 

Pełny przykład:

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
 4
Author: Tom Stickel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-17 17:30:25

We wcześniejszych wersjach Sql, możesz użyć rozszerzonego przechowywanego proc lub xp_cmdshell do wywołania usługi webservice.

Nie żeby któryś z nich brzmiał jak porządna architektura - ale czasami trzeba robić szalone rzeczy.

 3
Author: Mark Brackett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-06 21:40:54

Można to zrobić z osadzonymi obiektami VB.

Najpierw tworzysz jeden obiekt VB typu ' MSXML2.XMLHttp', i używasz tego jednego obiektu dla wszystkich zapytań(jeśli odtworzysz go za każdym razem, spodziewaj się dużej kary za wydajność).

Następnie przesyłasz ten obiekt, niektóre parametry, do procedury składowanej, która wywołuje sp_OAMethod na obiekcie.

Przepraszam za przykład inprecise, ale szybkie wyszukiwanie w google powinno ujawnić, jak wygląda metoda VB-script załatwione.

--

Ale wersja CLR jest dużo....Dużo łatwiej. Problem z wywoływaniem usług internetowych polega na tym,że nie nadążają one za silnikiem DB. Dostaniesz wiele błędów, w których po prostu nie nadąża.

I pamiętaj, że Usługi internetowe wymagają nowego połączenia za każdym razem. Wielość wchodzi w grę. Nie chcesz otwierać połączeń z gniazdami 5000, aby obsługiwać wywołanie funkcji na stole. To wariat!

W takim przypadku musisz utworzyć niestandardową funkcję agregującą, i użyj tego jako argumentu, aby przekazać do usługi internetowej, która zwróci zestaw wyników...więc musiałbyś to zestawić. To naprawdę niezręczny sposób zdobywania danych.

 2
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-22 17:04:20

Jeśli pracujesz z poziomami zgodności sql 2000 i nie możesz wykonać integracji clr, zobacz http://www.vishalseth.com/post/2009/12/22/Call-a-webservice-from-TSQL-(Stored-Procedure)-using-MSXML.aspx

 1
Author: bander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-23 20:53:34

Zgodziłem się, że to nie jest coś, co chcesz robić, jednak czasami musisz robić rzeczy, które nie najlepiej lubisz robić. W tym przypadku skończyło się na ponownym napisaniu funkcji usługi internetowej jako funkcji sql, aby wykonać to samo zadanie.

Dzięki za wszystkie linki i sugestie.

 0
Author: TheEmirOfGroofunkistan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-03 17:09:38