2013-04-11 1 views
0

저장 프로 시저가 수동으로 실행 중이지만 SQL Server 에이전트를 사용하여 실행되지는 않습니다.SQL XML 구문 분석 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 @[email protected]+1 
END 

Drop Table #TextData 
Drop Table #XMLData 
+0

우리가 당신을 도울 수 있도록 몇 가지 코드를 보여 주어야합니다. 특히 작업 단계 정의와 저장 프로 시저를 확인해야합니다. – RBarryYoung

+0

일정을 실행할 때 무언가가 작동하지만 일정을 예약하지 않은 경우 무언가가 거의 항상 사용 권한 또는 환경입니다. 예약 된 작업은 기본적으로 SQL Server 에이전트 서비스 계정으로 실행되며이 계정은 계정에서 수행하는 모든 시스템 리소스에 대한 액세스 권한이 없을 수 있습니다. 또는 작업을 예약하는 서버에 테스트 서버와 동일한 드라이버 또는 구성이 없습니다. 그러나 절차가 정확히 무엇인지에 대한 정보가 없으면 문제가 실제로 무엇인지 말할 수 없습니다. – Pondlife

+0

@JenniferNolan 전체 절차 (또는 문제를 재현 할 수있는 하위 집합)를 게시하십시오. 문제는 코드 초기에 발생합니다. 또한 Job Step의 SQL 명령 텍스트를 게시하십시오. – RBarryYoung

답변

0

그냥 업데이 트입니다. 이것이 올바르게 작동하지 않는 이유는 사이트에서 가져온 XML이 잘 리기 때문입니다. 나는 왜 이런 일이 발생했는지 전혀 알지 못했지만 WinHttp.WinHttpRequest.5.1 대신 창에 wget을 사용했습니다.이 사이트에서 모든 데이터를 가져 와서 데이터를 파싱 할 수있는 웹 페이지로 직접 전달했습니다.