2016-12-09 36 views
0

我對SQL服務器中的XML不是很熟悉。我需要將下面的XML擴展到一個表格,但我不知道該怎麼做。有人能幫我嗎?如何將以下XML擴展到TSQL中的表中?

<MainNode> 
    <Type>Type1</Type> 
    <Group>Group1</Group> 
    <IDFile>File1</IDFile> 
    <IDFile>File2</IDFile> 
    <IDFile>File3</IDFile> 
    <IDFile>File4</IDFile> 
    <XP>XP1</XP> 
    <SubNode> 
     <Data1>Data1</Data1> 
     <Data2>Data2</Data2> 
    </SubNode> 
    <Parameters> 
     <Parameter> 
      <Name>PName1</Name> 
      <Value>PVal1</Value> 
     </Parameter> 
     <Parameter> 
      <Name>PName2</Name> 
      <Value>PVal2</Value> 
      </Parameter> 
    </Parameters>   
</MainNode> 

我的主要問題是如何展開包含多個元素的子節點。我也有重複節點號碼未知。

我用.nodes().value()功能

我的代碼如下所示:

declare @XML xml = '<MainNode> 
    <Type>Type1</Type> 
    <Group>Group1</Group> 
    <IDFile>File1</IDFile> 
    <IDFile>File2</IDFile> 
    <IDFile>File3</IDFile> 
    <IDFile>File4</IDFile> 
    <XP>XP1</XP> 
    <SubNode> 
     <Data1>Data1</Data1> 
     <Data2>Data2</Data2> 
    </SubNode> 
    <Parameters> 
     <Parameter> 
      <Name>PName1</Name> 
      <Value>PVal1</Value> 
     </Parameter> 
     <Parameter> 
      <Name>PName2</Name> 
      <Value>PVal2</Value> 
      </Parameter> 
    </Parameters>   
</MainNode>'; 

SELECT 
    Child.value('(Type)[1]', 'VARCHAR(100)') AS [Type], 
    Child.value('(Group)[1]', 'VARCHAR(10)') AS [Group] 
FROM 
    @XML.nodes('/MainNode') AS N(Child); 

我需要這樣的東西:

Type1 | Group1 | XP1 | Param1.1 Name | Param1.1 Value 
Type1 | Group1 | XP1 | Param1.2 Name | Param1.2 Value 
Type2 | Group2 | XP2 | Param2.1 Name | Param2.1 Value 

...

+0

當您使用您提供的示例XML數據填充時,最終所需SQL表的外觀如何? – 3N1GM4

回答

2

你的問題不是很明確...有許多不同的數據結構在你的XML中......在一個查詢中檢索它們並沒有什麼意義。

在下面的代碼中,我向你展示瞭如何從中得到某些東西。我希望你得到足夠的模板,自己管理剩下的模板。

declare @XML xml = 
'<MainNode> 
    <Type>Type1</Type> 
    <Group>Group1</Group> 
    <IDFile>File1</IDFile> 
    <IDFile>File2</IDFile> 
    <IDFile>File3</IDFile> 
    <IDFile>File4</IDFile> 
    <XP>XP1</XP> 
    <SubNode> 
    <Data1>Data1</Data1> 
    <Data2>Data2</Data2> 
    </SubNode> 
    <Parameters> 
    <Parameter> 
     <Name>PName1</Name> 
     <Value>PVal1</Value> 
    </Parameter> 
    <Parameter> 
     <Name>PName2</Name> 
     <Value>PVal2</Value> 
    </Parameter> 
    </Parameters> 
</MainNode>'; 

--The XQuery謂詞將讀取名爲 「IDFile」 的所有節點下面<MainNode>

SELECT 
    idf.value('.', 'NVARCHAR(10)') AS IDFile 
FROM 
    @XML.nodes('/MainNode/*[local-name()="IDFile"]') AS N(idf); 

--key - 值對:在<MainNode><SubNode>有KVPs:

SELECT 
    SubNode.value('local-name(.)', 'NVARCHAR(100)') AS NodeName, 
    SubNode.value('.', 'NVARCHAR(10)') AS NodeValue 
FROM 
    @XML.nodes('/MainNode/SubNode/*') AS N(SubNode); 

- 在<MainNode/Parameters>有一個典型的1:n相關的子結構:

SELECT 
    Prm.value('Name[1]', 'NVARCHAR(100)') AS ParamterName, 
    Prm.value('Value[1]', 'NVARCHAR(10)') AS ParameterValue 
FROM 
    @XML.nodes('/MainNode/Parameters/Parameter') AS N(Prm); 
+0

正是我需要的,10倍@Shnugo – new2ios

相關問題