2010-08-11 4 views
4

이 질문을 참조 XML에 정의 된 네임 스페이스. 그러나 네임 스페이스 요소가있을 때 노드 요소의 값을 가져올 수 없습니다.문제 배경에 대한

DECLARE @xmlWithNameSpace XML 
DECLARE @xmlWithoutNameSpace XML 

SET @xmlWithNameSpace = '<?xml version="1.0" encoding="UTF-8"?> 
    <Feed xmlns="gizmo"> 
     <Product id="4444"> 
      <ProductId>4444</ProductId> 
     </Product> 
    </Feed>' 

SET @xmlWithoutNameSpace = '<?xml version="1.0" encoding="UTF-8"?> 
    <Feed> 
     <Product id="4444"> 
      <ProductId>4444</ProductId> 
     </Product> 
    </Feed>' 

SELECT feed.product.value('@id[1]', 'INT') AS productId 
FROM @xmlWithNameSpace.nodes('declare namespace ns="gizmo"; /ns:Feed/ns:Product') feed(product) 

UNION ALL 

SELECT feed.product.value('ProductId[1]', 'INT') AS productId 
FROM @xmlWithNameSpace.nodes('declare namespace ns="gizmo"; /ns:Feed/ns:Product') feed(product) 

UNION ALL 

SELECT feed.product.value('@id[1]', 'INT') AS productId 
FROM @xmlWithoutNameSpace.nodes('/Feed/Product') feed(product) 

UNION ALL 

SELECT feed.product.value('ProductId[1]', 'INT') AS productId 
FROM @xmlWithoutNameSpace.nodes('/Feed/Product') feed(product) 

4444 
NULL 
4444 
4444 

무엇 내가 PRODUCTID 노드 (4444) 네임 스페이스가 사용의 가치를 잘못하고있는 중이 반환 예를 들면 다음과 같습니다입니까?

미리 안내해 주셔서 감사합니다.

답변

4

대답은 내가 namespece로 액세스하려고하는 노드 요소를 정의해야한다는 것입니다. 이 샘플은 모두 4444를 예상대로 반환합니다.

WITH XMLNAMESPACES ('gizmo' AS nsWithXNS) 

SELECT feed.product.value('@id[1]', 'INT') AS productId 
FROM @xmlWithNameSpace.nodes('/nsWithXNS:Feed/nsWithXNS:Product') feed(product) 

UNION ALL 

SELECT feed.product.value('nsWithXNS:ProductId[1]', 'INT') AS productId 
FROM @xmlWithNameSpace.nodes('/nsWithXNS:Feed/nsWithXNS:Product') feed(product) 

UNION ALL 

SELECT feed.product.value('@id[1]', 'INT') AS productId 
FROM @xmlWithNameSpace.nodes('declare namespace ns="gizmo"; /ns:Feed/ns:Product') feed(product) 

UNION ALL 

SELECT feed.product.value('declare namespace ns="gizmo"; ns:ProductId[1]', 'INT') AS productId 
FROM @xmlWithNameSpace.nodes('declare namespace ns="gizmo"; /ns:Feed/ns:Product') feed(product) 

감사합니다. 다른 사람에게 도움이되기를 바랍니다.

+0

위 부분 질문은 훌륭하게 작동하지만 SQL Server-2012에서 맨 아래 부분 (WITH 키워드 사용)은 구문 오류를 발생시킵니다. – Hardryv

+0

WITH 앞에 세미콜론을 추가하십시오. 도움이되기를 바랍니다. –

관련 문제