Sql server SQL Server XML XQuery选择where子句属性

Sql server SQL Server XML XQuery选择where子句属性,sql-server,xml,xquery-sql,Sql Server,Xml,Xquery Sql,我有一张包含以下内容的表格 Id | Guid | XmlDefinitionId 1 | 5a0bfc84-13ec-4497-93e0-655e57d4b482 | 1 2 | e28e786b-0856-40b6-8189-0fbd68aa3e45 | 1 在另一个表中存储了以下XML结构: <ActionActivity DisplayName="DisplayName 1" IsSkipped="False"

我有一张包含以下内容的表格

Id | Guid                                 | XmlDefinitionId
 1 | 5a0bfc84-13ec-4497-93e0-655e57d4b482 | 1
 2 | e28e786b-0856-40b6-8189-0fbd68aa3e45 | 1
在另一个表中存储了以下XML结构:

<ActionActivity DisplayName="DisplayName 1" IsSkipped="False" Id="5a0bfc84-13ec-4497-93e0-655e57d4b482">...</ActionActivity>
<p:Sequence DisplayName="Prerequisites">
    <ActionActivity DisplayName="Inner DisplayName 1" IsSkipped="False" Id="e28e786b-0856-40b6-8189-0fbd68aa3e45">...</ActionActivity>
</p:Sequence>
<ActionActivity DisplayName="DisplayName 2" IsSkipped="False" Id="dcc936dd-73c9-43cc-beb4-c636647d4851">...</ActionActivity>
根据Guid,我想显示displayname。现在我有下面的查询,它返回null。稍后,我希望第一个表中的每个guid都显示displayname

SELECT 
      Workflow
      ,CAST(Workflow as XML).value('data(//ActionActivity[@Id="73c9-43cc-beb4-c636647d4851"])[1]', 'nvarchar(50)') as displayname
  FROM SerializedData

有人想用sql查询显示displayname吗?

假设XML存储在XML类型的列中,您可以这样做-否则您需要将列转换为
XML

SELECT
    g.guid, x.display_name
FROM GuidTable g
     INNER JOIN 
     (
        SELECT 
            t.id as 'xml_id'
            , c.value('@Id', 'varchar(max)') as 'guid'
            , c.value('@DisplayName', 'varchar(max)') as 'display_name'
        FROM XmlTable t
            CROSS APPLY t.xml.nodes('//ActionActivity') as aa(c)
     ) x on x.guid = g.guid and x.xml_id = g.xmldefinitionid
基本上,上面的查询在
ActionActivity
节点分解XML。然后将分解的数据与
guid
xmldefinitionid
列上的
GuidTable
连接起来

输出:


显示包含XML的表的结构。另外,您发布的示例xml没有
WorkflowActivityId
attribute@har07谢谢你的反馈。我已经更新了问题。第二个表中的XML列是什么类型的?@har07 XML列是XML(.)
SELECT
    g.guid, x.display_name
FROM GuidTable g
     INNER JOIN 
     (
        SELECT 
            t.id as 'xml_id'
            , c.value('@Id', 'varchar(max)') as 'guid'
            , c.value('@DisplayName', 'varchar(max)') as 'display_name'
        FROM XmlTable t
            CROSS APPLY t.xml.nodes('//ActionActivity') as aa(c)
     ) x on x.guid = g.guid and x.xml_id = g.xmldefinitionid