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