finden alle doppelten Werte in einem Elementattribut

Ich habe ein XML-Dokument, das in SQL server 2005 gespeichert ist, dass ich alle doppelten Werte aus einem id-Attribut innerhalb eines xml-Elements finden möchte. Die xml sieht so aus:

<?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> 

In diesem Beispiel schaue ich, um ein sql-Ergebnis zu erzeugen, das alle "ID" -Attribute im gesamten XML-Dokument aussieht und mir mitteilen wird, dass "ID-2" ein doppelter Wert ist.

Ist das in XPATH möglich?

Danke für Ihre Hilfe!

  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; 

Der Schlüssel ist der XPath //*[@id] , der alle Dokumentelemente mit einem id Attribut auswählt.

Aktualisieren

Wenn sich das XML in einem Tabellenfeld befindet:

  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; 

Dies wählt doppelte Werte über alle Zeilen aus. Wenn Sie doppelte Attributwerte nur innerhalb jeder Zeile auswählen möchten, fügen Sie den Tabellen-Primärschlüssel der Gruppe hinzu:

 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;