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

Хранимая процедура выполняется вручную, но не будет выполняться с помощью агента SQL Server.

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

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

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

Я пытался найти проблему, но единственная подсказка, которую я имею, это то, что 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 @i=@i+1
END

Drop Table #TextData
Drop Table #XMLData

person Jennifer Nolan    schedule 11.04.2013    source источник
comment
Вам нужно будет показать нам код, чтобы мы могли вам помочь. В частности, нам нужно увидеть ваше определение шага задания и вашу хранимую процедуру.   -  person RBarryYoung    schedule 11.04.2013
comment
Если что-то работает, когда вы его запускаете, но не по расписанию, это почти всегда либо разрешения, либо среда. Запланированные задания выполняются от имени учетной записи службы агента SQL Server по умолчанию, и эта учетная запись может не иметь доступа ко всем системным ресурсам, которые есть у вашей учетной записи. Или сервер, на котором вы планируете задание, не имеет тех же драйверов или конфигурации, что и ваш тестовый сервер. Но без дополнительной информации о том, что именно делает процедура, трудно сказать, в чем проблема на самом деле.   -  person Pondlife    schedule 11.04.2013
comment
@JenniferNolan Опубликуйте всю процедуру (или любое ее подмножество, которое может воспроизвести проблему). Проблема возникает ранее в коде. Также опубликуйте текст команды SQL шага задания.   -  person RBarryYoung    schedule 11.04.2013


Ответы (1)


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

person Jennifer Nolan    schedule 09.05.2013