2014-10-31 4 views
0

, 내가 쿼리 아래 사용하여 삽입하기 위해 노력하고있어방법은 아래에 언급 한 바와 같이 내가 XML을 가지고

Declare @Message as xml 

set @Message='<message> 

      <body> 
      <ID>1</ID> 
      <setup_time>10</setup_time> 
      <prod_cycle_time>10</prod_cycle_time> 
      <unit>cas</unit> 
      <Flag>NULL</Flag> 
      <FillingPO>NULL</FillingPO> 
      <PackAtCAN1>NULL</PackAtCAN1> 
      </body> 
      </message>' 

INSERT into table(ID,Desc,Value) 
    SELECT p.value('ID[1]','INT'), 
     p.value('Desc[1]','NVARCHAR(50)'), 
     p.value('Value[1]','NVARCHAR(40)') 
    FROM @message.nodes('/message/Body/') x(p)  

내가 XML 위에 삽입 할 테이블 컬럼에 다른 XML 필드 값을 삽입하는 같은 데이터 형식

ID  Desc    Value 
1  setup_time  10 
1  prod_cycle_time 10 
1  unit    Case 
1  Flag    NULL 
1  FillingPO   NULL 
1  PackAtCAN1  NULL 

아래 언급하지만 난

단 하나 개의 레코드를 삽입 할 수있어

답변

1

두 가지를 변경해야합니다. 먼저 노드 기능에 body/ 뒤에 와일드 카드를 추가하여 모든 노드가 반환되는지 확인해야합니다. 그런 다음 선택에 당신 value('.', ...)이 값을 얻기 위해, 당신의 쿼리는 다음과 같이 끝 있도록 local-name는 요소 이름을 얻을 : 1 태그는 태그 이상이면 문 위

SELECT p.value('../../ID[1]','INT'), 
     p.value('local-name(.)','NVARCHAR(50)'), 
     p.value('.','NVARCHAR(40)') 
    FROM @message.nodes('/message/body/*') x(p)  
+0

가 노력하고 있습니다. 그러나 태그가 태그 안에있는 경우에도 동일한 문제가 발생합니다. 세트 @ 메시지 = ' 1 10 10 CAS NULL NULL NULL ' – user3237193

+0

'이면 ID'가 body 태그에 있다면, 당신은 c 당신이 그것을 찾고있는 곳을 잡아라. 'p.value ('ID [1]', 'INT') ' – GarethD

+0

위의 문장은 모든 xml 태그를 반환하며 테이블 형식의 값입니다. 하지만 "setup_time, prod_cycle_time, unit"필드와 같은 필드를 do.xml에 저장하는 방법은 가치가별로 없다. – user3237193

관련 문제