【问题标题】:Xml Parsing Issue in sql jobsql作业中的Xml解析问题
【发布时间】:2016-01-28 06:20:42
【问题描述】:

在 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


    【解决方案1】:

    你知道 Sql Agent TEXTSIZE 吗?

    直接在过程TEXTSIZE 512和exec中指定,在这种情况下你会得到同样的错误

    设置文本大小 -1

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

    【讨论】:

    • 这应该是答案。如thread 所示,只需在“EXEC [PROCEDURE]”之前添加“SET TEXTSIZE -1”即可。
    【解决方案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 内容无关的相同错误。
    • 如果你得到它总是总是具有相同的行和字符编号

    【讨论】:

    • 只有当我将上述语句放入 SQL JOB 时才会出现问题,否则它可以正常工作
    • @user2659502 奇怪...你总是得到相同的错误信息(相同的行号和字符位置)吗?我会在我的数据库中定义一个表,并在您尝试从中读取之前使用 INSERT 来存储实际的 XML。由于您的表@xmlT 将列定义为 XML,解析错误应该发生在插入它的那一刻,而不是稍后,当您尝试读取它时......真的很奇怪......
    • 这与 XML 解析无关,因为该过程在不用于 SQL Server 代理作业时有效。这仅仅是由于下面回答的“TEXT SIZE”的限制。
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多