2009-09-24 56 views
2

我有一個存儲在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結果,看起來在所有的「ID」整個XML文檔中的屬性,並會告訴我,「ID-2」是重複的值。

這在XPATH中可能嗎?

感謝您的幫助!

回答

2
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; 

的關鍵是,選擇具有id屬性的所有的文檔元素中的XPath //*[@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; 
+0

感謝您的回答! @x從哪裏來?我應該將XML字段聲明爲可變@x嗎? – Zaffiro 2009-09-24 19:28:18

+0

當XML文檔存儲在一個字段中時,我開發了這個帖子。 – 2009-09-24 19:50:31