Подтвердить что ты не робот

Вы можете вызвать веб-сервис из TSQL-кода?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Здесь подробно обсуждать подробно, но здесь ссылка на

Ответ 4

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

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

  • Вставка и обновление триггеров в таблице
  • Триггер называется 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

Ответ 5

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

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

Ответ 6

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

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

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

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

-

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

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

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

Ответ 8

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

Спасибо за все ссылки и предложения.

Ответ 9

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