我有一个SQL Server 2008数据库,从中提取了多个来自不同表的值,将其放入单个表中。其中包括从XML中提取的一些数据,最近这些数据被存储在单个级别上,例如:
<XMLData>
<Item>
<Name>Name1</Name>
<Value>Value1</Value>
</Item>
<Item>
<Name>Name2</Name>
<Value>Value2</Value>
</Item>
<Item>
<Name>Name3</Name>
<Value>Value3</Value>
</Item>
<Item>
<Name>Name4</Name>
<Value>Value4</Value>
</Item>
</XMLData>
我会使用以下方法提取所需信息:
SELECT
Name = IXML.value('(./Name)[1]', 'varchar(20)'),
Value = IXML.value('(./Value)[1]', 'varchar(20)')
INTO dbo.newTable
FROM dbo.oldTable
CROSS APPLY oldTable.InfoXML.nodes('/XMLData/item') Book(IXML)
这将返回:
Name Value
--------------
Name1 Value1
Name2 Value2
Name3 Value3
Name4 Value4
然而,现在XML列表已经改变,并在另一个列表内生成,如下所示:
<XMLData>
<LongDirectory>
<Category>
<Item>
<CategoryName>Cat1</CategoryName>
<SubCategory>
<Item>
<Name>Name1</Name>
<Value>Value1</Value>
</Item>
<Item>
<Name>Name2</Name>
<Value>Value2</Value>
</Item>
<Item>
<Name>Name3</Name>
<Value>Value3</Value>
</Item>
</SubCategory>
</Item>
<Item>
<CategoryName>Cat2</CategoryName>
<SubCategory>
<Item>
<Name>Name4</Name>
<Value>Value4</Value>
</Item>
<Item>
<Name>Name5</Name>
<Value>Value5</Value>
</Item>
</SubCategory>
</Item>
<Item>
<CategoryName>Cat3</CategoryName>
<SubCategory>
<Item>
<Name>Name6</Name>
<Value>Value6</Value>
</Item>
<Item>
<Name>Name7</Name>
<Value>Value7</Value>
</Item>
</SubCategory>
</Item>
</Category>
</LongDirectory>
</XMLData>
我需要生成的信息看起来像这样:
Name Value Category
-------------------------
Name1 Value1 Cat1
Name2 Value2 Cat1
Name3 Value3 Cat1
Name4 Value4 Cat2
Name5 Value5 Cat2
Name6 Value6 Cat3
Name7 Value7 Cat3
我该如何修改查询以适应结构变化?非常感谢您的帮助。