Любой набор переменных также может быть завершен в классе. Переменные «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
Да, вы можете создать, как это
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
Если вы работаете с уровнями совместимости sql 2000 и не можете выполнять интеграцию clr, см. http://www.vishalseth.com/post/2009/12/22/Call-a-webservice-from-TSQL - (хранимая процедура), с помощью-MSXML.aspx
Вы можете сделать это со встроенными объектами VB.
Сначала вы создаете один объект VB типа «MSXML2.XMLHttp», и вы используете этот один объект для всех своих запросов (если вы его воссоздаете каждый раз ожидайте значительного снижения производительности.
Затем вы передаете этот объект, некоторые параметры, в хранимую процедуру, которая вызывает объект sp_OAMethod для объекта.
Извините за пример inprecise, но быстрый поиск в google должен показать, как выполняется метод vb-script.
-
Но версия CLR намного ... МНОГО. Проблема с вызовом webservices заключается в том, что они не могут идти в ногу с движком БД.
И помните, что веб-сервисы требуют нового подключения каждый раз. Вступает в действие множественность. Вы не хотите открывать 5000 соединений сокетов для обслуживания вызова функции в таблице. Thats looney!
В этом случае вам нужно будет создать настраиваемую функцию агрегата и использовать THAT в качестве аргумента для перехода к вашему веб-сервису, который вернет набор результатов ... тогда у вас будет собрать это. Это действительно неудобный способ получения данных.
Не в самом коде T-SQL, но с SQL Server 2005 и выше они активировали возможность записи хранимых процедур CLR, которые по существу функционируют в .NET-коде, а затем раскрывают их как хранимые процедуры для потребления. Для этого у вас есть большая часть .NET framework, поэтому я вижу, что через это возможно потребление веб-сервиса.
Здесь немного подробно обсуждать здесь, но вот ссылка на статью MSDN по теме.
Конечно, вы можете , но это ужасная идея.
Поскольку вызовы веб-сервисов могут занимать произвольное количество времени и случайным образом выходить из строя, в зависимости от того, сколько игр в игре встречается в вашей сети в то время, вы не можете сказать, как долго это будет продолжаться брать.
На минимальном уровне вы, вероятно, смотрите полторы секунды к тому времени, когда он создает XML, отправляет HTTP-запрос удаленному серверу, который затем должен анализировать XML и отправлять ответ.
INSERT INTO BLAH
, вызвавший запуск веб-службы, должен будет дождаться завершения. Если это то, что происходит только в фоновом режиме, как ежедневная запланированная задача, производительность вашего приложения будет бомбить Согласился, что это не то, что нужно делать, но иногда вам приходится делать то, что вам не идеально нравится делать. В этом случае я переписал функцию веб-сервиса как функцию sql для выполнения той же задачи.
Спасибо за все ссылки и предложения.
Я бы не сделал этого для интенсивного трафика или критически важных вещей, ОДНАКО, если вам НЕ нужно получать обратную связь от службы, то на самом деле это замечательно.
Вот пример того, что я сделал.
Не делайте старый 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
Exec sp_OADestroy @Object
, как в примере @ kiran.Backwad
– TheEmirOfGroofunkistan
17 May 2017 в 16:19
sp_OA*
– Tom Stickel
17 May 2017 в 17:32
В более ранних версиях Sql вы могли использовать либо расширенный хранимый proc, либо xp_cmdshell для вывода оболочки и вызова веб-службы.
Не то, чтобы любой из них звучал как приличная архитектура, но иногда вам приходится делайте сумасшедшие вещи.