Можете ли вы вызвать веб-сервис из кода TSQL? - PullRequest
34 голосов
/ 29 августа 2008

Есть ли способ вызвать из хранимой процедуры или функции TSQL веб-службу?

Ответы [ 8 ]

28 голосов
/ 13 мая 2015

Да, вы можете создать как это

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
24 голосов
/ 29 августа 2008

Конечно, вы можете , но это ужасная идея.

Поскольку вызовы веб-службы могут занимать произвольное количество времени и произвольно завершаться неудачей, в зависимости от того, сколько игр контратаки играют в вашей сети в данный момент, вы не можете сказать, сколько времени это займет.

Как минимум, вы смотрите, вероятно, на полсекунды, когда он строит XML, отправляет HTTP-запрос на удаленный сервер, который затем должен проанализировать XML и отправить ответ обратно.

  1. Какое бы приложение ни выполняло запрос INSERT INTO BLAH, вызвавший срабатывание веб-службы, придется ждать его завершения. Если только это не происходит в фоновом режиме, как ежедневное запланированное задание, производительность вашего приложения будет взлетать

  2. Код, вызывающий веб-службу, запускается на сервере SQL и использует его ресурсы. Поскольку ожидание HTTP-запроса займет много времени, вы в конечном итоге израсходуете много ресурсов, что снова снизит производительность вашего сервера.

10 голосов
/ 29 августа 2008

Не в самом коде T-SQL, но в SQL Server 2005 и более поздних версиях они позволили писать хранимые процедуры CLR, которые по сути являются функциями в коде .NET, а затем представлять их как хранимые процедуры для потребления. Для этого у вас под рукой большая часть .NET Framework, поэтому я вижу, как можно использовать веб-сервис.

Это немного долго, чтобы обсудить здесь подробно, но вот ссылка на статью MSDN по теме.

5 голосов
/ 16 мая 2017

Я бы не стал делать это для интенсивного трафика или критически важных вещей, ОДНАКО, если вам НЕ нужно получать обратную связь от службы, то это действительно отличная вещь.

Вот пример того, что я сделал.

  1. Триггеры вставки и обновления в таблицу
  2. Триггер с именем Stored Proc, который передает данные JSON транзакции в конечную точку Web Api, которая затем вставляется в MongoDB в AWS.

Не делайте старый 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) 

Полный пример:

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
3 голосов
/ 29 августа 2008

В более ранних версиях Sql вы могли использовать расширенный хранимый процесс или xp_cmdshell для оболочки и вызова веб-службы.

Не то чтобы это звучало как приличная архитектура - но иногда вам приходится делать сумасшедшие вещи.

2 голосов
/ 22 декабря 2009

Вы можете сделать это со встроенными объектами VB.

Сначала вы создаете один объект VB типа 'MSXML2.XMLHttp' и используете этот один объект для всех ваших запросов (если вы воссоздаете его каждый раз, ожидайте значительного снижения производительности).

Затем вы передаете этот объект, некоторые параметры, в хранимую процедуру, которая вызывает sp_OAMethod для объекта.

Извините за неточный пример, но быстрый поиск в Google должен показать, как выполняется метод vb-script.

-

Но версия CLR намного .... НАМНОГО проще. Проблема с вызовом веб-сервисов заключается в том, что они не успевают за движком БД. Вы получите много ошибок, которые просто не справятся.

И помните, веб-сервисы требуют нового подключения каждый раз. Кратность входит в игру. Вы не хотите открывать 5000 сокетных соединений для обслуживания вызова функции в таблице. Вот чокнутый!

В этом случае вам нужно будет создать пользовательскую функцию агрегирования и использовать THAT в качестве аргумента для передачи вашему веб-сервису, который будет возвращать набор результатов ... тогда вам придется сопоставлять это. Это действительно неудобный способ получения данных.

1 голос
/ 23 декабря 2009

Если вы работаете с уровнями совместимости sql 2000 и не можете выполнить интеграцию с clr, см. http://www.vishalseth.com/post/2009/12/22/Call-a-webservice-from-TSQL-(Stored-Procedure)-using-MSXML.aspx

0 голосов
/ 11 января 2019

Я работал в крупных / глобальных компаниях по всему миру, используя базы данных Oracle. Мы постоянно потребляем веб-сервисы через БД с процедурами хранения и без проблем, даже с интенсивным трафиком. Все они для внутреннего использования, я имею в виду без доступа к интернету, только внутри завода. Я бы порекомендовал использовать его, но будьте очень осторожны с дизайном

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...