拆分XML变量,连接并插入临时表XML列

时间:2015-05-22 08:01:08

标签: sql sql-server xml sql-server-2008

我有一个XML变量,其中包含以下XML

<Fruits>
  <Fruit>
    <Type>Apple</Type>
    <FruitID>1</FruitID>
    <MoreInfo>
      <Info Name="GreenApples" Value="3900" />
    </MoreInfo>
  </Fruit>
  <Fruit>
    <Type>Orange</Type>
    <FruitID>2</FruitID>
    <MoreInfo>
      <Info Name="Oranges" Value="1100" />
    </MoreInfo>
  </Fruit>
</Fruits>

我正在尝试创建一个看起来像这样的临时表:

CREATE TABLE #XmlTable (
    email nvarchar(100),
    xmlNode XML
)

我的目标是:

email | xmlNode

one@email.com | <Fruit><Type>Apple</Type><FruitID>1</FruitID><MoreInfo><Info Name="GreenApples" Value="3900" /></MoreInfo></Fruit>
two@email.com | <Fruit><Type>Orange</Type><FruitID>2</FruitID><MoreInfo><Info Name="Oranges" Value="1100" /></MoreInfo></Fruit>

问题是当我拆分它并将其插入表中时,我不知道如何将其转换为XML。

我有以下执行此任务的SQL,但如何将其转换为XML?

INSERT INTO #XmlTable
SELECT  EOR.email, 
        xmlNode.Col.value('.', 'nvarchar(max)') AS XML
FROM @outputXML.nodes('/Fruits') xmlNode(Col)
CROSS APPLY @outputXML.nodes('/Fruits/Fruit/FruitID') xmlValue(i)
INNER JOIN #EmailsOfReceivers EOR
ON EOR.ID= xmlValue.i.value('.','nvarchar(max)')

它工作正常,但当然xmlNode列没有XML标记。

2 个答案:

答案 0 :(得分:2)

这是一种可能的方式:

INSERT INTO #XmlTable
SELECT  EOR.email, 
        fruit.x.query('.') AS XML
FROM @outputXML.nodes('/Fruits/Fruit') fruit(x)
INNER JOIN #EmailsOfReceivers EOR
ON EOR.ID = fruit.x.value('FruitID[1]','nvarchar(max)')

<强> Fiddle demo

基本上,在<Fruit>个节点上粉碎XML,然后您可以使用query()而不是value()来获取XML标记。

附注:如果可能的话,我会FruitID而不是int返回nvarchar(max)

答案 1 :(得分:1)

您可以将.query('.')用于xml列:

DECLARE @outputXML XML

SELECT @outputXML = '<Fruits>
  <Fruit>
    <Type>Apple</Type>
    <FruitID>1</FruitID>
    <MoreInfo>
      <Info Name="GreenApples" Value="3900" />
    </MoreInfo>
  </Fruit>
  <Fruit>
    <Type>Orange</Type>
    <FruitID>2</FruitID>
    <MoreInfo>
      <Info Name="Oranges" Value="1100" />
    </MoreInfo>
  </Fruit>
</Fruits>'

INSERT INTO #XmlTable
SELECT  EOR.email, 
        xmlNode.Col.query('.') AS MyXML
FROM @outputXML.nodes('/Fruits/Fruit') xmlNode(Col)
INNER JOIN #EmailsOfReceivers EOR
ON EOR.ID = xmlNode.Col.value('FruitID[1]','nvarchar(max)')