Проблема синтаксического анализа XML в задании sql

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

Выполнено от имени пользователя: NT AUTHORITY\SYSTEM.

Синтаксический анализ XML: строка 10, символ 33
Неожиданный конец ввода [SQLSTATE 42000] (ошибка 9400). Шаг не удался.
Уровень серьезности SQL 16, идентификатор сообщения SQL 9400

Код:

    declare  @URL VARCHAR(max) 

    set @url = 'http://www.spa.gov.sa/english/rss.xml'

    declare  @xmlT TABLE (yourXML XML)
    DECLARE @Response nvarchar(max)
    DECLARE @XML xml
    DECLARE @Obj int 
    DECLARE @Result int 
    DECLARE @HTTPStatus int 
    DECLARE @ErrorMsg nvarchar(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 @xmlT ( yourXML )
    EXEC @Result = sp_OAGetProperty @Obj, 'responseXML.xml'--, @Response OUT 


    INSERT into Tlb(discp, tit, datee, linkk)

--below оператор создает проблему, когда я удаляю этот оператор, он работает везде

        SELECT   
            N.C.value('description[1]', 'nvarchar(max)') discp,   
            N.C.value('title[1]', 'varchar(999)') tit,
            N.C.value('pubDate[1]', 'varchar(99)') datee,
            N.C.value('link[1]', 'varchar(999)') linkk
        FROM
            @xmlT 
        CROSS APPLY 
            yourXML.nodes('//channel/item') N(C)

3 ответа

Знаете ли вы о Sql Agent TEXTSIZE?

Укажите непосредственно в процедуре TEXTSIZE 512 и exec, вы получите ту же ошибку в этом случае

SET TEXTSIZE -1

ИЛИ другое значение, я использую -1 для неограниченного размера по умолчанию sql server текстовый размер на агенте SQL равен 512

Ваш код, как получить плоский файл по URL-адресу работает нормально...

После этого

INSERT @xmlT ( yourXML )
EXEC @Result = sp_OAGetProperty @Obj, 'responseXML.xml'

... ваша объявленная табличная переменная содержит одну строку с допустимым XML.

"строка 10 символа 33" может указывать на

  1. полностью отрезан из-за небольшой переменной varchar где-то посередине
    • в моем тесте строка 10 даже не имеет так много символов...
    • Возможно, содержимое файла меняется, но первые 10 строк, похоже, содержат довольно устойчивые данные...
    • Попробуйте изменить свой @xmlT хранить VARCHAR(MAX) и сделать чистый SELECT, Файл поставляется в виде предварительно отформатированного "красивого" xml... Итак: сообщаемая строка и номера символов должны быть в порядке...
  2. неверный XML (например, отсутствует закрывающий тег)
    • Если XML неверен из источника, он не должен иметь значения, как вы его называете...
  3. неправильный символ
    • Может быть, что есть некоторая проблема с кодировкой

Мой любимый вариант - 1). Поскольку отраженная ошибка говорит о "синтаксическом анализе XML - неожиданный конец ввода", я бы предположил, что прочитанный вами XML-код где-то вырезан...

Узнать

  • если вы получаете ту же ошибку независимо от содержимого XML.
  • если вы получаете его всегда и всегда с одной и той же строкой и номером символа

Перед запуском хранимой процедуры необходимо установить для параметра TEXTSIZE значение неограниченное.

      **SET TEXTSIZE -1**
declare @Year int = year(getdate())
declare @Month int = month(getdate())
declare @Gun int = day(getdate())
exec UPR_GetDovizKurlari_MerkezBankasi @Year,@Month,@Day
Другие вопросы по тегам