代码之家  ›  专栏  ›  技术社区  ›  Zaffiro

在元素属性中查找所有重复值

  •  2
  • Zaffiro  · 技术社区  · 15 年前

    我有一个存储在SQL Server 2005中的XML文档,我想从XML元素中的ID属性中查找所有重复的值。XML如下所示:

        <?xml version="1.0" encoding="utf-8"?>
    <session sessionValue="" id="ID-1">
      <data id="ID-3">
        <id>d394E6FF844734CB9A5E8B17612DC050A</id>
        <TotalResult>803</TotalResult>
        <AgencyListRequestURL>http://ews.harleysvillegroup.com:5555/invoke/HmiPortalDCTRedirect.flows:getAgencyList</AgencyListRequestURL>
        <system id="systemid">      
          <global id="ID-2">
            <id>gEBE0E6C2D61340698B264E30D1B2DC59</id>
            <Button />
            <GlobalOutputSpacer />
            <Spacer />
            <LocationIDToCompare />
            <MasterManuScriptID />
            <CurrentVehicle />
          </global>
          <page id="ID-2">
            <id>p7B81433D8EB4400CA775CB3F7F0AD4DE</id>
            <DialogMode>0</DialogMode>
            <DifferentAddress>0</DifferentAddress>
          </page>
        </system>   
      </data>
    </session>
    

    在本例中,我希望生成一个SQL结果,该结果查找整个XML文档中的所有_id_属性,并将告诉我 __ID-2__ 是重复值。

    这在xpath中是可能的吗?

    谢谢你的帮助!

    1 回复  |  直到 15 年前
        1
  •  3
  •   Remus Rusanu    15 年前
      select id, count(*)
      from (  
        select x.value('@id', 'varchar(100)') as id
        from @x.nodes('//*[@id]') t(x)) as ids
      group by id
      having count(*) > 1;
    

    关键是xpath //*[@id] 选择具有 id 属性。

    更新

    如果XML在表字段中:

      select id, count(*)
      from (  
        select x.value('@id', 'varchar(100)') as id
        from [<table>]
        cross apply [<table>].[<field>].nodes('//*[@id]') t(x)) as ids
      group by id
      having count(*) > 1;
    

    这将选择 全部的 排。如果只想在每行中选择重复的属性值,请将表主键添加到分组依据:

    select id, <primary key>, count(*)
    from (  
      select x.value('@id', 'varchar(100)') as id
        , <primary key>
      from [<table>]
      cross apply [<table>].[<field>].nodes('//*[@id]') t(x)) as ids
    group by id, <primary key>
    having count(*) > 1;