2014-11-25 2 views
1

SQL Server 2008의 XML에서 일부 정보를 가져와야하지만 기본 속성도 가져올 수 없습니다. 내가 시도한 모든 샘플이 실패했습니다. 테이블 이름은 Item이고 xml 열 이름은 Data입니다.SQL에서 XML 값 쿼리

단순화 된 XML은 다음과 같습니다

<AnchoredXml xmlns="urn:schema:Microsoft.Rtc.Management.ScopeFramework.2008" SchemaWriteVersion="2"> 
    <Key ScopeClass="Global"> 
    <SchemaId Namespace="urn:schema:Microsoft.Rtc.Management.Deploy.Topology.2008" ElementName="Topology" /> 
    <AuthorityId Class="Host" InstanceId="00000000-0000-0000-0000-000000000000" /> 
    </Key> 
    <Dictionary Count="1"> 
    <Item> 
     <Key /> 
     <Value Signature="a3502dd0-8c16-4023-9eea-30ea1c7a3a2b"> 
     <Topology xmlns="urn:schema:Microsoft.Rtc.Management.Deploy.Topology.2008"> 
      <Services> 
      <Service RoleVersion="1" ServiceVersion="6" Type="Microsoft.Rtc.Management.Deploy.Internal.ServiceRoles.FileStoreService"> 
       <ServiceId SiteId="1" RoleName="FileStore" Instance="1" /> 
       <DependsOn /> 
       <InstalledOn> 
       <ClusterId SiteId="1" Number="1" /> 
       </InstalledOn> 
       <Ports xmlns="urn:schema:Microsoft.Rtc.Management.Deploy.ServiceRoles.2008" /> 
       <FileStoreService xmlns="urn:schema:Microsoft.Rtc.Management.Deploy.ServiceRoles.2008" ShareName="lyncShare" /> 
      </Service> 
      </Services> 
     </Topology> 
     </Value> 
    </Item> 
    </Dictionary> 
</AnchoredXml> 

내가 (더 행이) 올바른 XML을 선택 AnchoredXml/키 /받은 SchemaID/@ 이름 공간에 정보를 알아볼 필요가있다. 위의 샘플 xml은 올바른 것입니다. 그 후 적절한 서비스를 찾을 필요가 있습니다.

Type="Microsoft.Rtc.Management.Deploy.Internal.ServiceRoles.FileStoreService" 

여기서 필요한 서비스는 FileStoreService/@ ShareName입니다.

처음 네임 스페이스 attributte를 인쇄하려고 시도했지만 샘플 코드가 작동하지 않습니다. 몇 가지 시도 :

SELECT c.p.value('(@Namespace)[1]', 'varchar(50)') as 'Nmspace' 
FROM Item 
CROSS APPLY Data.nodes('/AnchoredXml/Key/SchemaId') c(p) 

반환 빈 결과는 따옴표 ("")

없이 모든 행에 대한 모든 행에 대한

SELECT 
It.Data.exist('/AnchoredXml/Key/SchemaId[@Namespace="Microsoft.Rtc.Management.Deploy.Topology.2008"]') 
FROM [xds].[dbo].[Item] AS It 

0을 반환의를

SELECT Data.value('(/AnchoredXml/Key/SchemaId/@Namespace)[1]', 'varchar(50)') 
FROM Item 

반환 NULL을 설정

적어도 속성 테스트를 수행하는 작업 샘플 코드로 충분할 수 있으며 나는 나머지를 알아낼 것이다. 제 쿼리에서 오류를 찾거나 다른 문제를 식별하도록 도와주십시오. 감사합니다.

답변

1

XML 문서에의 모든 XML 네임 스페이스를 무시하고 있습니다! 당신은 그것들에주의를 기울여 그들을 존경해야합니다!

은에 XML 네임 스페이스가 있습니다

  • 루트 노드 <AnchoredXml>
    (XML 네임 스페이스 :)
  • 하위 노드 <Topology>
    (XML의 NS : urn:schema:Microsoft.Rtc.Management.Deploy.Topology.2008)
  • 하위 노드 <FileStoreService>
    (XML ns : urn:schema:Microsoft.Rtc.Management.Deploy.ServiceRoles.2008)

이 시도 : 내 경우

-- respect the XML namespaces!! 
;WITH XMLNAMESPACES(DEFAULT 'urn:schema:Microsoft.Rtc.Management.ScopeFramework.2008', 
        'urn:schema:Microsoft.Rtc.Management.Deploy.Topology.2008' AS t, 
        'urn:schema:Microsoft.Rtc.Management.Deploy.ServiceRoles.2008' AS fss) 
SELECT 
    ShareName = Data.value('(/AnchoredXml/Dictionary/Item/Value/t:Topology/t:Services/t:Service/fss:FileStoreService/@ShareName)[1]', 'varchar(50)') 
FROM 
    dbo.Item 

, 이것은 반환

ShareName 
----------- 
lyncShare 
+0

은 참으로 내 문제의 원인이었다! 고맙습니다. 하나의 필터 만 추가하면됩니다. WHERE Data.exist ('(/ AnchoredXml/Key/SchemaId [@ 네임 스페이스 = "스키마 : Microsoft.Rtc.Management.Deploy.Topology.2008"])') = 1 – Geralt