存储过程在手动运行时工作,而不是从sql server agent运行

时间:2013-04-15 15:43:27

标签: sql sql-server sql-server-2008 tsql

我有一个使用SSMS中的execute命令运行良好的存储过程,但是在作业中放入相同的命令会产生以下错误。

  

第9行,第9个字符,意外结束输入

代码采用UTF-8编码的非常长的XML字符串,并将其放入单个nvarchar(max)单元格中。然后将此字符串放入另一个表中的XML单元格中,允许我使用nodes函数查询XML代码的各个部分。由于编码差异,我无法将数据直接放入nvarchar单元格。

我不能在这里重现字符串,因为它非常长。

我只是在寻找可能出错的地方。

目前我所知道的是:

  1. 执行手动

  2. 时,该过程无问题
  3. 我检查过权限问题,这似乎不是问题所在。代理程序在我自己的帐户下运行,我是数据库中的系统管理员

  4. 我将程序拆分为单独的部分,以准确定位问题发生的位置。手动执行时,单独的过程再次运行正常,但在通过SQL Server代理运行时会发生错误。

  5. 当通过SQL Server代理单独运行查询时,它会产生稍微不同的错误。这让我相信这是一个编码问题。但是我从网页上获取XML,但我无法更改网页上的编码。

  6.   

    第1行,第38个字符,无法切换编码

    我知道这是一个很长的镜头,因为你不能复制这个问题,但是如果有人能够知道从哪里开始寻找答案,那将非常感激。

    Edit1:非常感谢你的帮助。我不得不花一点时间远离问题来清醒我的脑袋。回到本周。

    好的,我想我终于找到了问题的根源。这是我用来从网站上获取数据的代码。它正在截断从网站上提取的数据。它在SSMS中执行时运行完美。它在批处理文件中运行时将数据截断为2048个字符,并在使用SS作业运行时将数据截断为512个字符。

    这些值不能是随机的。某处必须有设置,但我找不到它。有什么想法吗?

    以下是代码:

    DECLARE 
    
    @url nvarchar(max),
    @win integer,
    @hr integer ,
    @Date date,
    @SearchDate nvarchar(50)
    
    Delete from XMLParsing.dbo.TextData
    
    Set @Date = GETDATE()
    
    set @SearchDate = CAST(@Date as nvarchar(50))
    
    set @SearchDate = REPLACE(@SearchDate,'-','')
    
    Select @url = 'http://semorep.sem-o.com/DataCollection/DataSets.asmx/queryDatasetXML?DatasetName=SET_CAL&User=primplims@gmail.com&Password=testsemo&FromDate=20130103&ToDate=20130111&P1=Energy&P2=Statements&P3=Initial&P4=&P5='
    
    EXEC @hr=sp_OACreate 'WinHttp.WinHttpRequest.5.1',@win OUT 
    IF @hr <> 0 EXEC sp_OAGetErrorInfo @win 
    
    EXEC @hr=sp_OAMethod @win, 'Open',NULL,'GET',@url,'false'
    IF @hr <> 0 EXEC sp_OAGetErrorInfo @win 
    
    EXEC @hr=sp_OAMethod @win,'Send'
    IF @hr <> 0 EXEC sp_OAGetErrorInfo @win 
    
    INSERT XMLParsing.dbo.TextData(SEMO_Data)
    EXEC @hr=sp_OAGetProperty @win,'ResponseText'
    IF @hr <> 0 EXEC sp_OAGetErrorInfo @win
    
    EXEC @hr=sp_OADestroy @win 
    IF @hr <> 0 EXEC sp_OAGetErrorInfo @win 
    

3 个答案:

答案 0 :(得分:6)

指定

SET TEXTSIZE 200000 

在SQL代理作业步骤中。 SQL代理的默认TEXTSIZE512

答案 1 :(得分:1)

只是一个更新。这不能正常工作的原因是从网站上获取的XML被截断。我从来没有完全弄清楚为什么会这样,但我使用 wget for windows 而不是WinHttp.WinHttpRequest.5.1,它从网站获取所有数据并将其直接传递给我可以从中解析数据的网页。

答案 2 :(得分:0)

刚刚放好 SET TEXTSIZE (with a great value)

和SQL Agent完成剩下的工作。