2013-04-11 2 views
0

Сохраненная процедура запускается вручную, но не запускается с использованием агента SQL Server.SQL XML Parsing Хранимая процедура выполняется вручную, а не выполняется с помощью агента SQL Server

Я получаю следующую ошибку

выполняется как пользователь: XXX. Разбор XML: строка 9, символ 9, неожиданный конец ввода [SQLSTATE 42000] (ошибка 9400). Не удалось выполнить этот шаг.

Хранимая процедура берет xml из веб-запроса, помещает его в одну ячейку в таблице temp. Разбирает данные из таблицы temp и помещает новую легко читаемую информацию в постоянную таблицу. Мне нужен запрос для ежедневного запуска и получения данных за этот день.

Я попытался найти проблему, но единственный ключ, который у меня есть, заключается в том, что XML где-то рубит. Я понятия не имею, почему это происходит только для работы.

Любая помощь, которую вы могли бы дать, была бы замечательной.

Благодаря

EDIT1: Я разделить процедуру на 7 различных шагов. Это шаг, на который он падает.

INSERT XMLData(XMLD) SELECT CAST(HTML AS XML) As XMLData FROM TextData

EDIT2: Вот код

DECLARE 

@url varchar(2048), 
@win integer, 
@hr integer , 
@text varchar(MAX), 
@XMLdata XML, 
@Date date, 
@SearchDate nvarchar(50) 


Set @Date = GETDATE() 

set @SearchDate = CAST(@Date as nvarchar(50)) 

set @SearchDate = REPLACE(@SearchDate,'-','') 


--set @SearchDate='20130405' 

/*-- Create Temporary tables to be used to store the xml data--*/ 
/*-- We need 2 tables as the raw data from SEMO is Unicode 'UTF-8' but SQL only handles 'UTF-16'--*/ 
/*-- We must therefore store the data first as Text and then CAST it to XML datatype for easy querying later --*/ 
CREATE TABLE #TextData(HTML text NULL) 
CREATE TABLE #XMLData(XMLD xml NULL) 

/*-- This url will have to be dynamically generated each day based on GetDate() query or similiar - to be cracked out fully - random date picked for now--*/ 
Select @url = 'http://.......' 

/* Use OLE Automation Objects to go out and get the data--*/  
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 #TextData(HTML) 
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 

/*-- Now CAST the text data to XML data type which makes it much easier to query back--*/ 
INSERT #XMLData(XMLD) 
SELECT CAST(HTML AS XML) As XMLData FROM #TextData 



/*-- WE NEED TO ADD IN A SECTION HERE NOW TO PARSE THE XML DATA AND EXTRACT THE INFO WE NEED INTO A DEDICATED TABLED--*/ 

/*-- Replace the : in the #XMLData table with _ as the colons were causing errors --*/ 
UPDATE #XMLData 
SET XMLD = REPLACE(CAST(XMLD as varchar(max)),':' ,'_') 
FROM #XMLData 
WHERE CHARINDEX(':' ,CAST(XMLD as varchar(max)))>0 

UPDATE #XMLData 
SET XMLD = REPLACE(CAST(XMLD as varchar(max)),'DataSet xmlns="http_//localhost/SemoReporting/SemoAutomatedDataCollection/Datasets"' ,'DataSet') 
FROM #XMLData 
WHERE CHARINDEX('DataSet xmlns="http_//localhost/SemoReporting/SemoAutomatedDataCollection/Datasets"' ,CAST(XMLD as varchar(max)))>0 

Select @XMLdata = XMLD 
FROM #XMLData 

/*-- This is to show the colons have been replaced --*/ 
SELECT * FROM #XMLData 

Declare @i as int 
set @i = 1 

While @i < 97 
BEGIN 
/*Insert Data into SEMO Historical Table*/ 

INSERT INTO XMLParsing.dbo.T1301_SEMO_HISTORICAL_DATA 
/*-- This selects the relevant data from table1 element --*/ 
SELECT 
a.b.value('Table1[sql:variable("@i")][1]/CURRENCY_FLAG[1]','nvarchar(50)') AS [Currency], 
a.b.value('Table1[sql:variable("@i")][1]/TRADE_DATE[1]','date') AS [Trade Date], 
a.b.value('Table1[sql:variable("@i")][1]/DELIVERY_DATE[1]','date') AS [Delivery Date], 
a.b.value('Table1[sql:variable("@i")][1]/DELIVERY_HOUR[1]','int') AS [Delivery Hour], 
a.b.value('Table1[sql:variable("@i")][1]/DELIVERY_INTERVAL[1]','int') AS [Delivery Interval], 
a.b.value('Table1[sql:variable("@i")][1]/RUN_TYPE[1]','nvarchar(50)') AS [Run Type], 
a.b.value('Table1[sql:variable("@i")][1]/SMP[1]','decimal(10,4)') AS [SMP], 
a.b.value('Table1[sql:variable("@i")][1]/LAMBDA[1]','decimal(10,4)') AS [Lambda], 
a.b.value('Table1[sql:variable("@i")][1]/SYSTEM_LOAD[1]','decimal(10,4)') AS [System Load], 
a.b.value('Table1[sql:variable("@i")][1]/CMS_TIME_STAMP[1]','nvarchar(150)') AS [CMS Time Stamp] 
FROM @XMLdata.nodes('DataSet/diffgr_diffgram/EA_RESULTS') a(b) 
--where 
--not exists (Select * from SEMO_Historical_Data where [Trade Date] = @Date) 
set @[email protected]+1 
END 

Drop Table #TextData 
Drop Table #XMLData 
+0

Вам нужно будет показать нам некоторый код, чтобы мы могли вам помочь. В частности, нам нужно будет увидеть определение задания и хранимую процедуру. – RBarryYoung

+0

Если что-то работает, когда вы запускаете его, но не когда вы его планируете, это почти всегда либо разрешения, либо среда. Запланированные задания запускаются как учетная запись службы агента SQL Server по умолчанию, и эта учетная запись может не иметь доступа ко всем системным ресурсам вашей учетной записи. Или сервер, на котором вы планируете задание, не имеет одинаковых драйверов или конфигурации, которые ваш тестовый сервер делает. Но без дополнительной информации о том, что делает процедура, трудно сказать, в чем проблема. – Pondlife

+0

@JenniferNolan Опубликовать всю процедуру (или любое подмножество, которое может воспроизвести проблему). Проблема возникает ранее в коде. Также опубликуйте текст команды SQL рабочего шага. – RBarryYoung

ответ

0

Просто обновление. Причина, по которой это не работает, заключается в том, что XML, взятый с сайта, был усечен. Я никогда не выяснял, почему это происходит, но я использовал wget для Windows вместо WinHttp.WinHttpRequest.5.1, который взял все данные с сайта и передал его непосредственно на веб-страницу, из которой я мог анализировать данные.

Смежные вопросы