2

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

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

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

我无法在这里复制字符串,因为它非常长。

我只是在寻找关于哪里可能出错的想法。

到目前为止,这是我所知道的:

  1. 该过程在手动执行时运行没有问题

  2. 我检查了权限问题,这似乎不是问题。代理在我自己的帐户下运行,我是数据库的系统管理员

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

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

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

我知道这是一个很长的尝试,因为您无法复制该问题,但是如果有人可以就从哪里开始寻找答案给出一个想法,我们将不胜感激。

编辑1:非常感谢您的帮助。我不得不从这个问题上抽出一点时间来理清头绪。这周回来。

好的,我想我终于找到了问题的根源。这是我用来从网站获取数据的代码。它正在截断从网站上提取的数据。在 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 
4

3 回答 3

6

指定

SET TEXTSIZE 200000 

在 SQL 代理作业步骤中。SQL 代理的默认TEXTSIZE值为512.

于 2014-01-06T13:25:43.180 回答
1

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

于 2013-05-09T14:38:21.287 回答
0

就放 SET TEXTSIZE (with a great value)

其余的由 SQL 代理完成。

于 2015-09-11T11:24:10.330 回答