2017-05-22 4 views
1

각 테이블에는 파쇄 및 출력 테이블에 넣어야하는 알 수없는 조사 응답이 포함 된 XML 필드가있는 원본 테이블이 있습니다. 나는 노드와 OPENXML을 시도해 보았지만 제대로 작동하지 않는 것 같습니다. 나의 연구에서, 나는 CROSS APPLY를 사용해야한다고 생각하고 있지만, 나는 이해하고 그것을 작동하게하는 방식으로 머리 속에 모든 것을 집어 넣을 수는 없다. 나는 간단한 것을 놓치고있는 것에 대해 사과한다. 그러나 나는 정말로 붙어 있었고, 이것을 다루는 방법에 대해 제안 된 어떤 도움에 감사 할 것이다.SQL Server의 XML 열을 새 테이블로 파쇄

<survey> 
    <data> 
     <result> 
      <id>12345</id> 
      <date_submitted>2017-05-10 09:30:15</date_submitted> 
      <url_variables> 
       <respondent_id> 
        <key>respondent_id</key> 
        <value>987654</value> 
        <type>url</type> 
       </respondent_id> 
       <respondent_level> 
        <key>respondent_level</key> 
        <value>5</value> 
        <type>url</type> 
       </respondent_level> 
      </url_variables> 
      <survey_data> 
       <question> 
        <id>1</id> 
        <answer>Yes</answer> 
       </question> 
       <question> 
        <id>2</id> 
        <answer>No</answer> 
       </question> 
       <question> 
        <id>3</id> 
        <subquestions> 
         <subquestion> 
          <id>4</id>       
          <answer>Maybe</answer> 
         </subquestion> 
         <subquestion> 
          <id>5</id>       
          <answer>I don't know</answer> 
         </subquestion> 
        </subquestions> 
       </question> 
       ... more questions ... 
      </survey_data> 
     </result> 
     <result> 
      <id>67890</id> 
      <date_submitted>2017-05-11 10:00:00</date_submitted> 
      <url_variables> 
       <respondent_id> 
        <key>respondent_id</key> 
        <value>34567</value> 
        <type>url</type> 
       </respondent_id> 
       <respondent_level> 
        <key>respondent_level</key> 
        <value>10</value> 
        <type>url</type> 
       </respondent_level> 
      </url_variables> 
      <survey_data> 
       <question> 
        <id>1</id> 
        <answer>No</answer> 
       </question> 
       <question> 
        <id>2</id> 
        <answer>Yes</answer> 
       </question> 
       <question> 
        <id>3</id> 
        <subquestions> 
         <subquestion> 
          <id>4</id>       
          <answer>Definitely not</answer> 
         </subquestion> 
         <subquestion> 
          <id>5</id>       
          <answer>I object</answer> 
         </subquestion> 
        </subquestions> 
       </question> 
       ... more questions ... 
      </survey_data> 
     </result> 
     ... more results ... 
    <data> 
</survey> 
:

ImportId SurveyId DateImported    ResponseData 
-------- -------- ------------    ------------ 
1   11223344 2017-05-21 18:00:00.00 <survey><data><result>... 
2   55667788 2017-05-21 18:01:00.00 <survey><data><result>... 
3   99009988 2017-05-21 18:02:00.00 <survey><data><result>... 

여기 드 responseData 열에서 XML의 간단한 예입니다 : 여기

은 다음과 같습니다 가져온 데이터 (내가 통제 할 수없는 형식)를 포함하는 소스 테이블의

ResultId SurveyId RespondentId RespondentLevel DateSubmitted 
-------- -------- ------------ --------------- ------------- 
12345  11223344 987654   5     2017-05-10 09:30:15 
67890  11223344 34567   10     2017-05-11 10:00:00 
... 
(Data extracted from the rest of ImportId 1 followed by ImportId 2, 3, etc) 

ResultId  QuestionId SubquestionId Answer 
---------- ---------- ------------- ------ 
12345   1    0    Yes 
12345   2    0    No 
12345   3    4    Maybe 
12345   3    5    I don't know 
67890   1    0    No 
67890   2    0    Yes 
67890   3    4    Definitely not 
67890   3    5    I object 
... 
(Data extracted from the rest of ImportId 1 followed by ImportId 2, 3, etc) 
0,123,516 :

나는 각 드 responseData 분야에서 복수의 결과를 얻기 위해 XML을 파쇄,이 데이터를 가지고 다음과 같은 두 개의 테이블에 넣어 필요

+0

두 개의 쿼리

예를 필요 당신이 읽을 수 있습니다 [이] (http://stackoverflow.com/questions/13931604/t-sql-convert-xml-field-to-multi-column-data 세트). –

답변

1

두 테이블의 경우, (나는 단지 한 기록을 사용하지만, 여러 적용됩니다)

Declare @YourTable Table ([ImportId] int,[SurveyId] int,[DateImported] datetime,[ResponseData] xml) 
Insert Into @YourTable Values 
(1,11223344,'2017-05-21 18:00:00.00','<survey><data><result><id>12345</id><date_submitted>2017-05-10 09:30:15</date_submitted><url_variables><respondent_id><key>respondent_id</key><value>987654</value><type>url</type></respondent_id><respondent_level><key>respondent_level</key><value>5</value><type>url</type></respondent_level></url_variables><survey_data><question><id>1</id><answer>Yes</answer></question><question><id>2</id><answer>No</answer></question><question><id>3</id><subquestions><subquestion><id>4</id><answer>Maybe</answer></subquestion><subquestion><id>5</id><answer>I don''t know</answer></subquestion></subquestions></question></survey_data></result><result><id>67890</id><date_submitted>2017-05-11 10:00:00</date_submitted><url_variables><respondent_id><key>respondent_id</key><value>34567</value><type>url</type></respondent_id><respondent_level><key>respondent_level</key><value>10</value><type>url</type></respondent_level></url_variables><survey_data><question><id>1</id><answer>No</answer></question><question><id>2</id><answer>Yes</answer></question><question><id>3</id><subquestions><subquestion><id>4</id><answer>Definitely not</answer></subquestion><subquestion><id>5</id><answer>I object</answer></subquestion></subquestions></question></survey_data></result></data></survey>') 

Select B.* 
From @YourTable A 
Cross Apply (
       Select [ResultID]  = r.n.value('(id)[1]','int') 
         ,A.[SurveyId] 
         ,[RespondentId] = r.n.value('(url_variables/respondent_id/value)[1]','int') 
         ,[RespondentLevel] = r.n.value('(url_variables/respondent_level/value)[1]','int') 
         ,[DateSubmitted] = r.n.value('(date_submitted)[1]','datetime') 
       From A.[ResponseData].nodes('survey/data/result') r(n) 
      ) B 


Select B.* 
From @YourTable A 
Cross Apply (
       Select [ResultID]  = r.n.value('(id)[1]','int') 
         ,[QuestionId] = IsNull(q.n.value('(id)[1]','int'),0) 
         ,[SubquestionId] = IsNull(s.n.value('(id)[1]','int'),0) 
         ,[answer]  = concat(q.n.value('(answer)[1]','varchar(50)') 
               ,s.n.value('(answer)[1]','varchar(50)') 
               ) 
       From A.[ResponseData].nodes('survey/data/result') r(n) 
       Cross Apply r.n.nodes('survey_data/question')  q(n) 
       Outer Apply q.n.nodes('subquestions/subquestion') s(n) 
      ) B 

반환 어쩌면

enter image description here

+0

완벽한! 정말 고맙습니다; 너는 생명의 은인이야. – Sunny

+0

@Sunny 도와 드리겠습니다. –