Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вывести в таблицу результат хранимой процедуры  [new]
feelka88
Member

Откуда:
Сообщений: 7
Есть процедура:
+
USE [Logs_test]
GO
/****** Object:  StoredProcedure [dbo].[spHTTPRequest]    Script Date: 31.08.2015 12:35:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[spHTTPRequest] 
      @URI varchar(2000) = '',      
      @methodName varchar(50) = '', 
      @requestBody varchar(8000) = '', 
      @SoapAction varchar(255), 
      @UserName nvarchar(100), -- Domain\UserName or UserName 
      @Password nvarchar(100), 
      @responseText varchar(8000) output
as
SET NOCOUNT ON
IF    @methodName = ''
BEGIN
      select FailPoint = 'Method Name must be set'
      return
END
set   @responseText = 'FAILED'
DECLARE @objectID int
DECLARE @hResult int
DECLARE @source varchar(255), @desc varchar(255) 
EXEC @hResult = sp_OACreate 'MSXML2.ServerXMLHTTP', @objectID OUT
IF @hResult <> 0 
BEGIN
      EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
      SELECT      hResult = convert(varbinary(4), @hResult), 
                  source = @source, 
                  description = @desc, 
                  FailPoint = 'Create failed', 
                  MedthodName = @methodName 
      goto destroy 
      return
END
-- open the destination URI with Specified method 
EXEC @hResult = sp_OAMethod @objectID, 'open', null, @methodName, @URI, 'false', @UserName, @Password
IF @hResult <> 0 
BEGIN
      EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
      SELECT      hResult = convert(varbinary(4), @hResult), 
            source = @source, 
            description = @desc, 
            FailPoint = 'Open failed', 
            MedthodName = @methodName 
      goto destroy 
      return
END
-- set request headers 
EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, 'Content-Type', 'text/xml;charset=UTF-8'
IF @hResult <> 0 
BEGIN
      EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
      SELECT      hResult = convert(varbinary(4), @hResult), 
            source = @source, 
            description = @desc, 
            FailPoint = 'SetRequestHeader failed', 
            MedthodName = @methodName 
      goto destroy 
      return
END
-- set soap action 
EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, 'SOAPAction', @SoapAction 
IF @hResult <> 0 
BEGIN
      EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
      SELECT      hResult = convert(varbinary(4), @hResult), 
            source = @source, 
            description = @desc, 
            FailPoint = 'SetRequestHeader failed', 
            MedthodName = @methodName 
      goto destroy 
      return
END
declare @len int
set @len = len(@requestBody) 
EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, 'Content-Length', @len 
IF @hResult <> 0 
BEGIN
      EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
      SELECT      hResult = convert(varbinary(4), @hResult), 
            source = @source, 
            description = @desc, 
            FailPoint = 'SetRequestHeader failed', 
            MedthodName = @methodName 
      goto destroy 
      return
END
/* 
-- if you have headers in a table called RequestHeader you can go through them with this 
DECLARE @HeaderKey varchar(500), @HeaderValue varchar(500) 
DECLARE RequestHeader CURSOR
LOCAL FAST_FORWARD 
FOR
      SELECT      HeaderKey, HeaderValue 
      FROM RequestHeaders 
      WHERE       Method = @methodName 
OPEN RequestHeader 
FETCH NEXT FROM RequestHeader 
INTO @HeaderKey, @HeaderValue 
WHILE @@FETCH_STATUS = 0 
BEGIN
      --select @HeaderKey, @HeaderValue, @methodName 
      EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, @HeaderKey, @HeaderValue 
      IF @hResult <> 0 
      BEGIN
            EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
            SELECT      hResult = convert(varbinary(4), @hResult), 
                  source = @source, 
                  description = @desc, 
                  FailPoint = 'SetRequestHeader failed', 
                  MedthodName = @methodName 
            goto destroy 
            return
      END
      FETCH NEXT FROM RequestHeader 
      INTO @HeaderKey, @HeaderValue 
END
CLOSE RequestHeader 
DEALLOCATE RequestHeader 
*/ 
-- send the request 
EXEC @hResult = sp_OAMethod @objectID, 'send', null, @requestBody 
IF    @hResult <> 0 
BEGIN
      EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
      SELECT      hResult = convert(varbinary(4), @hResult), 
            source = @source, 
            description = @desc, 
            FailPoint = 'Send failed', 
            MedthodName = @methodName 
      goto destroy 
      return
END
declare @statusText varchar(1000), @status varchar(1000) 
-- Get status text 
exec sp_OAGetProperty @objectID, 'StatusText', @statusText out
exec sp_OAGetProperty @objectID, 'Status', @status out
select @status, @statusText, @methodName 
-- Get response text 
exec sp_OAGetProperty @objectID, 'responseText', @responseText out
IF @hResult <> 0 
BEGIN
      EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
      SELECT      hResult = convert(varbinary(4), @hResult), 
            source = @source, 
            description = @desc, 
            FailPoint = 'ResponseText failed', 
            MedthodName = @methodName 
      goto destroy 
      return
END
destroy: 
      exec sp_OADestroy @objectID 
SET NOCOUNT OFF
 


Выполняю ее так:
--Берем из одной таблицы, помещаем во временную и преобразуем адрес

--select OriginalUrl into #temp12 from test_2708 
--UPDATE #temp12
--SET OriginalUrl = REPLACE(OriginalUrl, 'www', 'http://www')


--select * from #temp9
-- объявляем переменные




declare @xmlOut varchar(8000)
Declare @OriginalUrl nvarchar (4000)
Declare @RequestText as varchar(8000)
declare @hResult int
declare @URI varchar(2000) = ''    
declare @methodName varchar(50) = ''
declare @requestBody varchar(8000) = ''
declare @SoapAction varchar(255)
DECLARE @CURSOR CURSOR

--Вызываем процедуру с параметрами
SET @CURSOR  = CURSOR SCROLL
FOR
SELECT  OriginalUrl  
  FROM  #temp12
OPEN @CURSOR
FETCH NEXT FROM @CURSOR INTO @OriginalUrl
WHILE @@FETCH_STATUS = 0
BEGIN
exec spHTTPRequest 
@OriginalUrl, 
'GET', 
@RequestText,
'http://tempuri.org/CreateOrderForMe',
'', '', @xmlOut
 
FETCH NEXT FROM @CURSOR INTO @OriginalUrl

END

 CLOSE @CURSOR


Хранимая процедура проверяет доступность адреса
В таблице test_2708 хранятся адреса (www.test.ru\test).
Хотелось бы вытащить результат операции в виде | url | http code (200 or 404 or ...)
Заранее огромное спасибо!!

Сообщение было отредактировано: 2 сен 15, 12:01
31 авг 15, 15:34    [18091490]     Ответить | Цитировать Сообщить модератору
 Re: Вывести в таблицу результат хранимой процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
feelka88
Хотелось бы вытащить результат операции в виде | url | http code (200 or 404 or ...)
Заранее огромное спасибо!!

exec spHTTPRequest
@OriginalUrl,
'GET',
@RequestText,
'http://tempuri.org/CreateOrderForMe',
'', '', @xmlOut OUTPUT
31 авг 15, 15:53    [18091621]     Ответить | Цитировать Сообщить модератору
 Re: Вывести в таблицу результат хранимой процедуры  [new]
feelka88
Member

Откуда:
Сообщений: 7
Glory,

Спасибо!
31 авг 15, 16:54    [18092044]     Ответить | Цитировать Сообщить модератору
 Re: Вывести в таблицу результат хранимой процедуры  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Простите, я не в плане критики, а просто чтобы порассуждать, оценить все + и - ....

Вопрос: Смущает как-то такая архитектура. А не лучше ли такую логику (HTTP Request) вынести ЗА MSSQL? В SSIS пакет например, который в виде JOBа на SQL Server Agent-е доступен.
2 сен 15, 08:51    [18098168]     Ответить | Цитировать Сообщить модератору
 Re: Вывести в таблицу результат хранимой процедуры  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8353
Yuri Abele,
да, намного лучше.
2 сен 15, 11:57    [18099162]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить