Процедура автоматизации Ole возвращает ноль - PullRequest
0 голосов
/ 27 марта 2019

У меня следующая проблема.запустив sql ниже на нашем сервере, он возвращает ожидаемые результаты.Запустив то же самое на другом сервере, он не возвращает значений.

Сделал следующее:

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO

USE tempdb
GO

IF OBJECT_ID('tempdb..#xml') IS NOT NULL DROP TABLE #xml
CREATE TABLE #xml ( yourXML XML )
GO

DECLARE @URL VARCHAR(8000)

--DECLARE @QS varchar(50)

-- & or ? depending if there are other query strings
-- Use this for when there is other query strings:
--SELECT @QS = '&date='+convert(varchar(25),getdate(),126)
-- Use this for when there is NO other query strings:
-- SELECT @QS = '?date='+convert(varchar(25),getdate(),126)
SELECT @URL = 'http://exampleURL' -- + @QS

DECLARE @Response varchar(8000)
DECLARE @XML xml
DECLARE @Obj int
DECLARE @Result int
DECLARE @HTTPStatus int
DECLARE @ErrorMsg varchar(MAX)

EXEC @Result = sp_OACreate 'MSXML2.XMLHttp', @Obj OUT

EXEC @Result = sp_OAMethod @Obj, 'open', NULL, 'GET', @URL, false
EXEC @Result = sp_OAMethod @Obj, 'setRequestHeader', NULL, 'Content-Type', 'application/x-www-form-urlencoded'
EXEC @Result = sp_OAMethod @Obj, send, NULL, ''
EXEC @Result = sp_OAGetProperty @Obj, 'status', @HTTPStatus OUT

INSERT #xml ( yourXML )
EXEC @Result = sp_OAGetProperty @Obj, 'responseXML.xml'--, @Response OUT


declare @input XML=(
SELECT
yourXML
from
#xml)

SELECT
Item.value('(Code)[1]', 'nvarchar(max)') as Code,
Item.value('(Description)[1]', 'varchar(max)') as Description,
Item.value('(ImageUrl)[1]', 'nvarchar(max)') as ImageUrl
from
@input.nodes('//product') AS T(Item)

На втором сервере @input возвращает ноль.Существует прокси для доступа к сайту на сервере, и он работает с SQL Server 2008.

Есть идеи, почему нулевые значения?

1 Ответ

0 голосов
/ 10 мая 2019

У меня просто была похожая проблема, запрос с использованием Ole Automation неожиданно возвращает ноль без каких-либо ошибок. После изменения 'MSXML2.XMLHttp' на 'MSXML2.ServerXMLHTTP' он снова начал работать.

Чтобы узнать больше о разнице между этими двумя, см. Эту статью и документацию Microsoft . Я скопировал некоторые с сайта Microsoft, на случай, если оба сайта умрут в будущем.

Объект ServerXMLHTTP предлагает функциональность, аналогичную функциональности объекта XMLHTTP. Однако, в отличие от XMLHTTP, объект ServerXMLHTTP не использует элемент управления WinInet для доступа по HTTP к удаленным документам XML. ServerXMLHTTP использует новый стек клиента HTTP. Предназначенное для серверных приложений, это безопасное для сервера подмножество WinInet предлагает следующие преимущества:

  • Надежность - стек клиента HTTP обеспечивает более длительное время безотказной работы. Функции WinInet, которые не являются критичными для серверных приложений, такие как кэширование URL-адресов, автоматическое обнаружение прокси-серверов, разбиение на части HTTP / 1.1, автономная поддержка и поддержка протоколов Gopher и FTP, не включены в новое подмножество HTTP.
  • Безопасность - стек HTTP-клиента не позволяет совместно использовать пользовательское состояние с сеансом другого пользователя. ServerXMLHTTP обеспечивает поддержку клиентских сертификатов.
...