1
我需要帮助从我已发送的XML文件中提取数据(并且无法控制),通常不会有任何问题,但是此文件的结构方式让我感到困惑。下面的示例XML。我搜索的文章都没有,似乎在某种程度上,我需要TSQL读取基于元素属性的XML文件
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Entities TotalResults="3">
<Entity Type="testing"><Fields>
<Field Name="type"><Value>Internal</Value></Field>
<Field Name="name"><Value>Customer123</Value></Field>
<Field Name="updated"><Value>Yes</Value></Field>
</Fields></Entity>
<Entity Type="testing"><Fields>
<Field Name="type"><Value>External</Value></Field>
<Field Name="name"><Value>CustomerABC</Value></Field>
<Field Name="updated"><Value>Yes</Value></Field>
</Fields></Entity>
<Entity Type="testing"><Fields>
<Field Name="type"><Value>Unknown</Value></Field>
<Field Name="name"><Value>Customer456</Value></Field>
<Field Name="updated"><Value>No</Value></Field>
</Fields></Entity>
</Entities>
我要的是
实体的EntityType名称更新
1内部Customer123与此XML文件工作的解决方案是
2外部CustomerABC是
3未知Customer456没有
我可以从文件,但不是在我需要的格式的数据..
DECLARE @input XML
SELECT @input = CAST(x AS XML)FROM OPENROWSET(BULK 'C:\Test.xml', SINGLE_BLOB) AS T(x)
SELECT T1.steps.value('Value[1]', 'nvarchar(Max)') As EntityType
FROM @input.nodes('Entities/Entity/Fields/Field') AS Tbl(Scan)
CROSS APPLY Tbl.Scan.nodes('.') as T1(steps)
Where Tbl.Scan.value('(@Name)[1]', 'varchar(max)') = 'type'
SELECT
T1.steps.value('Value[1]', 'nvarchar(Max)') As Name
FROM @input.nodes('Entities/Entity/Fields/Field') AS Tbl(Scan)
CROSS APPLY Tbl.Scan.nodes('.') as T1(steps)
Where Tbl.Scan.value('(@Name)[1]', 'varchar(max)') = 'name'
SELECT
T1.steps.value('Value[1]', 'nvarchar(Max)') As Updated
FROM @input.nodes('Entities/Entity/Fields/Field') AS Tbl(Scan)
CROSS APPLY Tbl.Scan.nodes('.') as T1(steps)
Where Tbl.Scan.value('(@Name)[1]', 'varchar(max)') = 'updated'
这给了我,每3个排三个独立的表,是有可能运行一个查询将返回的数据,因为我需要?