sql 作业中的 Xml 解析问题

问题描述 投票:0回答:3

我在 SQL Server 作业中执行查询时遇到错误。但如果我直接执行它,它就可以正常工作。

以用户身份执行:NT AUTHORITY\SYSTEM。

XML解析:第10行,第33个字符
输入意外结束 [SQLSTATE 42000](错误 9400)。该步骤失败。
SQL 严重性 16,SQL 消息 ID 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)

--当我删除此语句时,下面的语句会产生问题,它在任何地方都可以正常工作

        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)
sql-server xml sql-server-2008-r2 xml-parsing
3个回答
7
投票

你了解Sql Agent TEXTSIZE吗?

直接在程序中指定TEXTSIZE 512并执行,在这种情况下你会得到同样的错误

设置文本大小-1

或其他值,我默认使用 -1 表示无限大小的 SQL SQL 代理上的服务器文本大小为 512


2
投票

您的代码如何通过 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 内容如何,您都会遇到相同的错误。
  • 如果你得到它总是并且总是具有相同的行和字符数

0
投票

在运行存储过程之前,必须将 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
© www.soinside.com 2019 - 2024. All rights reserved.