Ошибка при попытке получить данные из XML через responseXML - PullRequest
1 голос
/ 19 сентября 2019

Я пытаюсь создать новую процедуру получения реальных курсов обмена валют с сайта.Для этого я использую хранимые процедуры OLE Automation.Но я столкнулся с проблемой при попытке получить данные с помощью sp_OAGetProperty из XML.

Когда я пытаюсь вставить XML во временную таблицу с помощью sp_OASetProperty, он выдает ошибку.Я пробовал много вещей, чтобы исправить это, но это решения в основном о XML, и я не очень разбираюсь в XML.Вот проблемная часть моего кода:

    DECLARE @OBJ AS INT
    DECLARE @RESULT AS INT

EXEC @RESULT=sp_OACreate 'MSXML2.XMLHTTP', @OBJ OUT 
EXEC @RESULT=sp_OAMethod @OBJ , 'open' , null , 'GET', @url, false
EXEC @RESULT=sp_OAMethod @OBJ, SEND, NULL,''

    IF OBJECT_ID('tempdb..#XML') IS NOT Null DROP TABLE #XML

    CREATE TABLE #XML (STRXML VARCHAR(max))
    INSERT INTO #XML (STRXML) EXEC @RESULT = sp_OASetProperty @OBJ,'responseXML.xml' ---> I am getting an error in this stage.

     SELECT * FROM #XML

Я ожидаю xml вот так:

   <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="isokur.xsl"?>  <Tarih_Date Tarih="18.09.2019" Date="09/18/2019" Bulten_No="2019/175">   .......  </Tarih_Date>  

Но вывод - пустой результат.Когда я исполняю sp_OAGetErrorInfo, чтобы получить ошибку, она показывает эту ошибку:

  Error Code: 0x80042727
  Description: sp_OASetProperty usage:  ObjPointer int IN, PropertyName varchar IN, @setval <any> IN [, additional indexing IN params].

1 Ответ

1 голос
/ 19 сентября 2019

Я бы посоветовал вам использовать хранимую процедуру SQL CLR для выполнения вызовов веб-службы и избегать MSXML2.XMLHTTP.MSXML2.XMLHTTP, в частности, и объекты OLE в целом не являются потокобезопасными, что означает, что одновременные вызовы из SQL могут вызвать проблемы.

Следующее, основанное на Вызов веб-службы из TSQL (хранимой процедуры) с использованиемMSXML , работает на SQL Server 2017 (64-разрядная версия) ...

/*
exec sp_configure 'Ole Automation Procedures', 1
go
reconfigure
go
*/
declare @TableVariable table (result nvarchar(max));
declare @hResult int, @object int, @Status nvarchar(max), @StatusText nvarchar(max), @Response nvarchar(max)
declare @url nvarchar(max) = 'http://www.geoplugin.net/xml.gp?ip=8.8.8.8'

declare @FailPoint nvarchar(max) = 'Create'
exec @hResult = sp_OACreate 'MSXML2.XMLHTTP', @object out
if (@hResult = 0)
begin
    set @FailPoint = 'Open'
    exec @hResult = sp_OAMethod @object , 'Open', null, 'GET', @url, 0
end
if (@hResult = 0)
begin 
    set @FailPoint = 'Send'
    exec @hResult = sp_OAMethod @object, 'Send'
end
if (@hResult = 0)
begin
    set @FailPoint = 'Status'
    delete @TableVariable
    insert @TableVariable exec @hResult = sp_OAMethod @object, 'Status'
    select @Status=result from @TableVariable;
end
if (@hResult = 0)
begin
    set @FailPoint = 'StatusText'
    delete @TableVariable
    insert @TableVariable exec @hResult = sp_OAMethod @object, 'StatusText'
    select @StatusText=result from @TableVariable
end
if (@hResult = 0)
begin
    set @FailPoint = 'ResponseText'
    delete @TableVariable
    insert @TableVariable exec @hResult = sp_OAMethod @object, 'ResponseText'
    select @Response=result from @TableVariable
end
if (@hResult != 0)
begin
    declare @Source nvarchar(max), @Description nvarchar(max)
    exec sp_OAGetErrorInfo @object, @Source out, @Description out
    select
        hResult = convert(varbinary(4), @hResult),
        Source = @Source,
        Description = @Description,
        FailPoint = @FailPoint
    goto Destroy 
end
select [Status]=@Status, [StatusText]=@StatusText, [Response]=@Response
Destroy:
    exec @hResult = sp_OADestroy @object
go

Если вы уверены, что ответ является допустимым XML, вы можете указать cast(@Response as xml).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...