2014-01-09 45 views
0

任何人都可以用下面的xml幫助我。我需要提取所有像下面這樣的xml值。在SQL Server中使用XML命名空間提取XML列的datav值

AwarYear Comments       FieldCode FieldNumber Key Value 
AY2013-14 AAI: Adjusted Available Income AAI   306  Blank None Calculated 

這裏是示例XML。

<SchemaType xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/process"> 
    <AwardYear>AY2013_14</AwardYear> 
    <Fields> 
    <FieldSchema> 
     <Comments>AAI: Adjusted Available Income</Comments> 
     <DbLocation>IsirData</DbLocation> 
     <FieldCode>AAI</FieldCode> 
     <FieldNumber>306</FieldNumber> 
     <ReportDisplay>Data</ReportDisplay> 
     <ValidContent> 
     <ValidValueContent xmlns:d5p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
      <d5p1:KeyValueOfstringstring> 
      <d5p1:Key>Blank</d5p1:Key> 
      <d5p1:Value>None calculated</d5p1:Value> 
      </d5p1:KeyValueOfstringstring> 
     </ValidValueContent> 
     </ValidContent> 
    </FieldSchema> 
     </Fields> 
</SchemaType> 

請做好充分的準備。提前致謝。

回答

4

假設你有一個表中的XML的XML柱像這裏面:

DECLARE @XmlTable TABLE (ID INT NOT NULL, XMLDATA XML) 

INSERT INTO @XmlTable VALUES(1, '<SchemaType xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/process"> 
    <AwardYear>AY2013_14</AwardYear> 
    <Fields> 
    <FieldSchema> 
     <Comments>AAI: Adjusted Available Income</Comments> 
     <DbLocation>IsirData</DbLocation> 
     <FieldCode>AAI</FieldCode> 
     <FieldNumber>306</FieldNumber> 
     <ReportDisplay>Data</ReportDisplay> 
     <ValidContent> 
     <ValidValueContent xmlns:d5p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
      <d5p1:KeyValueOfstringstring> 
      <d5p1:Key>Blank</d5p1:Key> 
      <d5p1:Value>None calculated</d5p1:Value> 
      </d5p1:KeyValueOfstringstring> 
     </ValidValueContent> 
     </ValidContent> 
    </FieldSchema> 
     </Fields> 
</SchemaType>') 

,那麼你可以使用這個T-SQL語句來獲取值:

;WITH XMLNAMESPACES(DEFAULT 'http://schemas.datacontract.org/process', 
        'http://schemas.microsoft.com/2003/10/Serialization/Arrays' AS ns1) 
SELECT 
    AwardYear = XmlData.value('(SchemaType/AwardYear)[1]', 'varchar(25)'), 
    Comments = XmlData.value('(SchemaType/Fields/FieldSchema/Comments)[1]', 'varchar(50)'), 
    FieldCode = XmlData.value('(SchemaType/Fields/FieldSchema/FieldCode)[1]', 'varchar(10)'), 
    FieldNumber = XmlData.value('(SchemaType/Fields/FieldSchema/FieldNumber)[1]', 'int'), 
    [Key] = XmlData.value('(SchemaType/Fields/FieldSchema/ValidContent/ValidValueContent/ns1:KeyValueOfstringstring/ns1:Key)[1]', 'varchar(10)'), 
    [Value] = XmlData.value('(SchemaType/Fields/FieldSchema/ValidContent/ValidValueContent/ns1:KeyValueOfstringstring/ns1:Value)[1]', 'varchar(10)') 
FROM 
    @XmlTable 

我所定義的頂層XML名稱空間作爲「默認」名稱空間(不需要在整個地方引用),並且結構內部的第二個名稱空間使用單獨的XML名稱空間前綴顯式定義。

+0

非常感謝您的幫助。它的工作。我幾乎在這個問題上留下了希望。 – user1884094

+0

@ user1884094:如果此答案有助於您解決問題,請[**接受此答案**](http://meta.stackexchange.com/q/5234/153998)。這將表明你對那些花時間幫助你的人表示感謝。 –