簡體   English   中英

拆分XML變量,連接並插入臨時表XML列

[英]Split XML variable, join and insert into a temp table XML column

我有一個包含以下XMLXML變量:

<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標記。

這是一種可能的方式:

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)')

小提琴演示

基本上,在<Fruit>節點上粉碎XML,然后您可以使用query()而不是value()來獲取XML標記。

旁注:如果可能的話,我FruitID作為int而不是nvarchar(max)返回。

您可以將.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)')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM