Sql server 在sql server中解析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:

<?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()节点引用。