Использование метода api post из SQL Server [duplicate]

Любой набор переменных также может быть завершен в классе. Переменные «Variable» могут быть добавлены к экземпляру класса во время выполнения, напрямую обращаясь к встроенному словарю через атрибут __dict__.

Следующий код определяет класс Variables, который добавляет переменные (в этом случае атрибуты) к своему экземпляру во время построения. Имена переменных берутся из указанного списка (который, например, мог быть сгенерирован программным кодом):

# some list of variable names
L = ['a', 'b', 'c']

class Variables:
    def __init__(self, L):
        for item in L:
            self.__dict__[item] = 100

v = Variables(L)
print(v.a, v.b, v.c)
#will produce 100 100 100
28
задан TheEmirOfGroofunkistan 28 August 2008 в 22:29
поделиться

8 ответов

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

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
17
ответ дан Rory McCrossan 22 August 2018 в 11:13
поделиться

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

1
ответ дан bander 22 August 2018 в 11:13
поделиться

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

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

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

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

-

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

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

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

2
ответ дан Brian 22 August 2018 в 11:13
поделиться
  • 1
    Что-то, о чем нужно помнить, используя встроенный CLR, как правило, выполняет MUCH, MUCH , MUCH лучше, чем использование OLE-объектов. У меня были некоторые небольшие функции CLR, которые по причинам клиента пришлось преобразовать для вызова OLE. Как только это произошло, у него получился МАССИВНЫЙ удар производительности. Функции CLR, которые возвратились, для всех целей и задач, мгновенно, внезапно заняли почти секунду, чтобы вернуться за вызов. – eidylon 11 August 2014 в 17:54

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

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

9
ответ дан Dillie-O 22 August 2018 в 11:13
поделиться

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

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

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

  1. Независимо от того, что запрос INSERT INTO BLAH, вызвавший запуск веб-службы, должен будет дождаться завершения. Если это то, что происходит только в фоновом режиме, как ежедневная запланированная задача, производительность вашего приложения будет бомбить
  2. . Вызывающий веб-сервис код запускается внутри SQL-сервера и использует его ресурсы. Поскольку потребуется много времени, чтобы дождаться HTTP-запроса, вы в конечном итоге воспользуетесь большим количеством ресурсов, что снова повредит производительности вашего сервера.
19
ответ дан Neysor 22 August 2018 в 11:13
поделиться
  • 1
    +1 для ", в зависимости от того, сколько игр контрудара воспроизводится в вашей сети в то время" и за хороший ответ. ;) – Hilton Perantunes 15 April 2010 в 15:03
  • 2
    Если вы скажете, что это можно сделать, вы должны объяснить, как это сделать. – Mark Bonafe 12 May 2016 в 13:35
  • 3
    Ответчик ниже положил его так хорошо (после предоставления полезных подсказок): «Не то, чтобы любой из них звучал как приличная архитектура, но иногда вам нужно делать сумасшедшее дерьмо». – wunth 5 September 2017 в 21:00

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

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

0
ответ дан TheEmirOfGroofunkistan 22 August 2018 в 11:13
поделиться

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

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

  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
4
ответ дан Tom Stickel 22 August 2018 в 11:13
поделиться
  • 1
    Спасибо за пример. Вы также включили Exec sp_OADestroy @Object, как в примере @ kiran.Backwad – TheEmirOfGroofunkistan 17 May 2017 в 16:19
  • 2
    @TheEmirOfGroofunkistan - хорошо есть сообщение полного кода – Tom Stickel 17 May 2017 в 17:30
  • 3
    Некоторые люди перешли на CLR - это работает, поэтому я просто не беспокоился о замене вызовов sp_OA* – Tom Stickel 17 May 2017 в 17:32
  • 4
    Я использую этот скрипт, но ничего не отправил в webservice. Зачем !? – alireza 29 May 2018 в 11:21

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

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

3
ответ дан Yvette Colomb 22 August 2018 в 11:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: