2014-11-17 2 views
0

이 XML 파일을 광범위하게 파쇄하는 가장 좋은 방법을 연구했으며, 원하는대로 모든 방법을 제공하지는 않았습니다.XML 파일을 SQL Server 테이블에 분할합니다.

SQL Server를 사용하고 싶지만 Visual Studio 2012도 있습니다.

다음은 내가 작업하고있는 XML 데이터 형식의 조각입니다. 제 3 자의 XML 작성 방법을 제어 할 수 없습니다. 현실 아래 노드에는 ResponseID, Name, Status 등의 약 450 가지 응답 유형이 있습니다. 단지 약 10 가지만 보여줍니다.

<xml> 
    <Response> 
     <ResponseID>R_a4yThVvKXzVyftz</ResponseID> 
     <ResponseSet>Default Response Set</ResponseSet> 
     <Name>Doe, John</Name> 
     <ExternalDataReference>0</ExternalDataReference> 
     <EmailAddress>[email protected]</EmailAddress> 
     <IPAddress>140.123.12.123</IPAddress> 
     <Status>0</Status> 
     <StartDate>2014-09-18 09:21:11</StartDate> 
     <EndDate>2014-09-23 16:09:58</EndDate> 
     <Finished>1</Finished> 
      </Response> 
</xml> 

은 내가 OPENROWSET 방법이 같은 쿼리를 사용하여이 사이트

http://blogs.msdn.com/b/simonince/archive/2009/04/24/flattening-xml-data-in-sql-server.aspx

에 표시된 시도했다 :

SELECT 
a1.value('(RESPONSEID/text())[1]', 'varchar(50)') as RESPONSEID, 
a2.value('(RESPONSESET/text())[1]', 'varchar(50)') as RESPONSESET, 
a3.value('(NAME/text())[1]', 'varchar(50)') as NAME 
FROM XmlSourceTable 
CROSS APPLY XmlData.nodes('//Response') AS RESPONSEID(a1) 
CROSS APPLY XmlData.nodes('//Response') AS RESPONSESET(a2) 
CROSS APPLY XmlData.nodes('//Response') AS NAME(a3) 

나는이 번 일을 얻었다을하지만났습니다 출력은 반복되는 값이었고 테이블 형식으로 나타나지 않았습니다. 실제로는 테이블이 매우 넓어서 적어도 450 행이긴하지만 아래 출력과 같습니다.

RESPONSEID RESPONSESET NAME EXTERNALDATAREFERENCE EMAILADDRESS IPADDRESS STATUS STARTDATE ENDDATE 
R_a4yThVvKXzVyftz Default Response Set Doe, John 1/1/2014 [email protected] 123.12.123 0 9/18/2014 9:21 9/23/2014 16:09 
R_06znwEis73yLsnX NonDefault Response Set Doe, Jane 1/1/2014 [email protected] 123.12.123 0 9/18/2014 5:29 9/29/2014 9:42 
R_50HuB0jDFfI6hmZ Response Set 1 Doe, Cindy 1/1/2014 [email protected] 123.12.123 0 9/18/2014 17:21 10/1/2014 11:45 

: 또 다른 문제는 내가 강력하게 소비하는 것을 선호 거라고하지만이 .txt로 그것을 가져 변환 그래서이 과정을 자동화 할 수 있습니다 네이티브 XML을 절단하지 수 이상 255 인 폭에 기인한다 나는 각각 약 500 추가 테이블 결과 모든 응답 노드 테이블을 생성 응답 테이블 외에 Nodehowever에 대해 하나의 테이블을 생성 XML 파일을 파쇄하려면이 응용 프로그램

https://www.novixys.com/ExultSQLServer/

을 발견했다. 또한 응용 프로그램은 당신이 십자가를 추출 할 각 값에 대해 적용 추가 할 필요가 없습니다 $ (250) ..

https://www.novixys.com/ExultSQLServer/

+0

질문을 명확하게 할 수 있습니까? 또한 ExultSQLServer와 관련이 없습니다. – Raptor

+0

현재로서는 필자의 요구에 맞는 솔루션이 아니지만 XML 파일을 성공적으로 조각 낼 수있는 방법을 제공하므로 Exult를 언급했습니다. –

답변

1

비용이 든다. 하나이면 충분합니다.

SELECT 
    R.X.value('(ResponseID/text())[1]', 'varchar(50)') as RESPONSEID, 
    R.X.value('(ResponseSet/text())[1]', 'varchar(50)') as RESPONSESET, 
    R.X.value('(Name/text())[1]', 'varchar(50)') as NAME 
FROM XmlSourceTable 
    CROSS APPLY XmlData.nodes('//Response') AS R(X) 
+0

완벽하게 작동합니다. –