Есть ли способ вызвать из хранимой процедуры или функции TSQL веб-сервис?
Вы можете вызвать веб-сервис из TSQL-кода?
Ответ 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 в качестве аргумента для перехода к вашему веб-сервису, который вернет набор результатов... тогда вам придется сопоставить это. Это действительно неудобный способ получения данных.
Ответ 7
Если вы работаете с уровнями совместимости sql 2000 и не можете выполнять интеграцию clr, см. http://www.vishalseth.com/post/2009/12/22/Call-a-webservice-from-TSQL-(Stored-Procedure)-using-MSXML.aspx
Ответ 8
Согласился, что это не то, что нужно делать, но иногда вам приходится делать то, что вам не идеально нравится делать. В этом случае я переписал функцию веб-сервиса как функцию sql для выполнения той же задачи.
Спасибо за все ссылки и предложения.
Ответ 9
Я работал в крупных/глобальных компаниях по всему миру, используя базы данных Oracle. Мы постоянно потребляем веб-сервисы через БД с процедурами хранения и без проблем, даже с интенсивным трафиком. Все они для внутреннего использования, я имею в виду без доступа к Интернету, только внутри завода. Я бы порекомендовал использовать его, но быть очень осторожным в том, как вы его проектируете