Sql server 在sql server中解析xml有困难
我有一个类似于下面的XML:Sql server 在sql server中解析xml有困难,sql-server,tsql,Sql Server,Tsql,我有一个类似于下面的XML: <?xml version="1.0"?> <Entities> <Entity> <Entity_Sequence>1</Entity_Sequence> <Entity_Schema_Name>XYZ</Entity_Schema_Name> <Entity_ID>839674039</Entity_ID&
<?xml version="1.0"?>
<Entities>
<Entity>
<Entity_Sequence>1</Entity_Sequence>
<Entity_Schema_Name>XYZ</Entity_Schema_Name>
<Entity_ID>839674039</Entity_ID>
<Entity_Name>EntName1</Entity_Name>
<Entity_Type>1</Entity_Type>
<Entity_Alias>X</Entity_Alias>
<Entity_ID>839674039</Entity_ID>
<Attributes>
<Attribute>
<Attribute_Sequence>1</Attribute_Sequence>
<Attribute_Name>Attr1</Attribute_Name>
<Filter_Operator>24002</Filter_Operator>
<Filter_Value>12</Filter_Value>
</Attribute>
<Attribute>
<Attribute_Sequence>2</Attribute_Sequence>
<Attribute_Name>2</Attribute_Name>
<Filter_Operator>24001</Filter_Operator>
<Filter_Value>22</Filter_Value>
</Attribute>
</Attributes>
</Entity>
</Entities>
1.
XYZ
839674039
EntName1
1.
X
839674039
您可以尝试以下方法:
SELECT
a.b.value('Entity_Sequence[1]','varchar(10)') AS Entity_Sequence,
a.b.value('Entity_Schema_Name[1]','varchar(10)') AS Entity_Schema_Name,
a.b.value('Entity_ID[1]','varchar(10)') AS Entity_ID,
a.b.value('Entity_Name[1]','varchar(10)') AS Entity_Name,
a.b.value('Entity_Type[1]','varchar(10)') AS Entity_Type,
a.b.value('Entity_Alias[1]','varchar(10)') AS Entity_Alias,
tab.col.value('Attribute_Sequence[1]', 'varchar(10)') as Attribute_Sequence,
tab.col.value('Attribute_Name[1]', 'varchar(10)') as Attribute_Name,
tab.col.value('Filter_Operator[1]', 'varchar(10)') as Filter_Operator,
tab.col.value('Filter_Value[1]', 'varchar(10)') as Filter_Value
FROM @MyXML.nodes('/Entities/Entity') a(b) cross apply a.b.nodes('Attributes/Attribute') as tab(col)
我从主xml中读取实体值,然后在属性节点处使用交叉应用
来获取嵌套的xml值
您可以检查此操作的工作版本。您可以尝试以下操作:
SELECT
a.b.value('Entity_Sequence[1]','varchar(10)') AS Entity_Sequence,
a.b.value('Entity_Schema_Name[1]','varchar(10)') AS Entity_Schema_Name,
a.b.value('Entity_ID[1]','varchar(10)') AS Entity_ID,
a.b.value('Entity_Name[1]','varchar(10)') AS Entity_Name,
a.b.value('Entity_Type[1]','varchar(10)') AS Entity_Type,
a.b.value('Entity_Alias[1]','varchar(10)') AS Entity_Alias,
tab.col.value('Attribute_Sequence[1]', 'varchar(10)') as Attribute_Sequence,
tab.col.value('Attribute_Name[1]', 'varchar(10)') as Attribute_Name,
tab.col.value('Filter_Operator[1]', 'varchar(10)') as Filter_Operator,
tab.col.value('Filter_Value[1]', 'varchar(10)') as Filter_Value
FROM @MyXML.nodes('/Entities/Entity') a(b) cross apply a.b.nodes('Attributes/Attribute') as tab(col)
我从主xml中读取实体值,然后在属性节点处使用交叉应用
来获取嵌套的xml值
您可以使用您提供的信息检查此文件的工作版本。(请注意,您的屏幕截图与您的数据不匹配:
DECLARE @yourxml XML=
'<Entities>
<Entity>
<Entity_Sequence>1</Entity_Sequence>
<Entity_Schema_Name>XYZ</Entity_Schema_Name>
<Entity_ID>839674039</Entity_ID>
<Entity_Name>EntName1</Entity_Name>
<Entity_Type>1</Entity_Type>
<Entity_Alias>X</Entity_Alias>
<Entity_ID>839674039</Entity_ID>
<Attributes>
<Attribute>
<Attribute_Sequence>1</Attribute_Sequence>
<Attribute_Name>Attr1</Attribute_Name>
<Filter_Operator>24002</Filter_Operator>
<Filter_Value>12</Filter_Value>
</Attribute>
<Attribute>
<Attribute_Sequence>2</Attribute_Sequence>
<Attribute_Name>2</Attribute_Name>
<Filter_Operator>24001</Filter_Operator>
<Filter_Value>22</Filter_Value>
</Attribute>
</Attributes>
</Entity>
</Entities>'
SELECT
Entity_Sequence = ent.e.value('(Entity_Sequence/text())[1]', 'varchar(100)'),
Entity_Schema_Name = ent.e.value('(Entity_Schema_Name/text())[1]', 'varchar(100)'),
[Entity_ID] = ent.e.value('(Entity_ID/text())[1]', 'varchar(100)'),
[Entity_Name] = ent.e.value('(Entity_Name/text())[1]', 'varchar(100)'),
Entity_Type = ent.e.value('(Entity_Type/text())[1]', 'varchar(100)'),
Entity_Alias = ent.e.value('(Entity_Alias/text())[1]', 'varchar(100)'),
Attribute_Sequence = att.a.value('(Attribute_Sequence/text())[1]', 'varchar(100)'),
Attribute_Name = att.a.value('(Attribute_Name/text())[1]', 'varchar(100)'),
Filter_Operator = att.a.value('(Filter_Operator/text())[1]', 'varchar(100)'),
Filter_Value = att.a.value('(Filter_Value/text())[1]', 'varchar(100)')
FROM (VALUES (@yourxml)) t(x)
CROSS APPLY t.x.nodes('Entities/Entity') ent(e)
CROSS APPLY ent.e.nodes('Attributes/Attribute') att(a);
使用您提供的信息(请注意,您的屏幕截图与您的数据不匹配:
DECLARE @yourxml XML=
'<Entities>
<Entity>
<Entity_Sequence>1</Entity_Sequence>
<Entity_Schema_Name>XYZ</Entity_Schema_Name>
<Entity_ID>839674039</Entity_ID>
<Entity_Name>EntName1</Entity_Name>
<Entity_Type>1</Entity_Type>
<Entity_Alias>X</Entity_Alias>
<Entity_ID>839674039</Entity_ID>
<Attributes>
<Attribute>
<Attribute_Sequence>1</Attribute_Sequence>
<Attribute_Name>Attr1</Attribute_Name>
<Filter_Operator>24002</Filter_Operator>
<Filter_Value>12</Filter_Value>
</Attribute>
<Attribute>
<Attribute_Sequence>2</Attribute_Sequence>
<Attribute_Name>2</Attribute_Name>
<Filter_Operator>24001</Filter_Operator>
<Filter_Value>22</Filter_Value>
</Attribute>
</Attributes>
</Entity>
</Entities>'
SELECT
Entity_Sequence = ent.e.value('(Entity_Sequence/text())[1]', 'varchar(100)'),
Entity_Schema_Name = ent.e.value('(Entity_Schema_Name/text())[1]', 'varchar(100)'),
[Entity_ID] = ent.e.value('(Entity_ID/text())[1]', 'varchar(100)'),
[Entity_Name] = ent.e.value('(Entity_Name/text())[1]', 'varchar(100)'),
Entity_Type = ent.e.value('(Entity_Type/text())[1]', 'varchar(100)'),
Entity_Alias = ent.e.value('(Entity_Alias/text())[1]', 'varchar(100)'),
Attribute_Sequence = att.a.value('(Attribute_Sequence/text())[1]', 'varchar(100)'),
Attribute_Name = att.a.value('(Attribute_Name/text())[1]', 'varchar(100)'),
Filter_Operator = att.a.value('(Filter_Operator/text())[1]', 'varchar(100)'),
Filter_Value = att.a.value('(Filter_Value/text())[1]', 'varchar(100)')
FROM (VALUES (@yourxml)) t(x)
CROSS APPLY t.x.nodes('Entities/Entity') ent(e)
CROSS APPLY ent.e.nodes('Attributes/Attribute') att(a);
嵌套的值中没有属性\u ID,但您需要一些值嵌套\u谓词\u属性\u ID。您从何处获得这些信息?更正。感谢您的指点。基本上,我希望在每一行中重复父元素和子元素。如果我们还有一个层次结构,是否可以在这里进行第三次交叉应用?我希望您有到目前为止,您一直在尝试,并发现是的,您可以做到这一点。:)嵌套的值中没有属性\u ID,但您需要一些值嵌套\u谓词\u属性\u ID。您从何处获得这些信息?更正。感谢您的指点。基本上,我希望在每一行中重复父元素和子元素。如果我们还有一个层次结构,是否可以在这里进行第三次交叉应用?我希望您有尝试到现在,发现是的,你可以做到。:)哈哈!你赢了我一分钟!我们提出了几乎相同的解决方案。。。为了优化性能,您希望在提取文本时包含text()节点引用。哈哈!你赢了我一分钟!我们提出了几乎相同的解决方案。。。对于性能优化,您希望在提取文本时包含text()节点引用。