我有一个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标记。
答案 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)')