在Xml列中查找重复项

时间:2013-09-27 04:38:13

标签: sql xml sql-server-2008 tsql sqlxml

我有一个包含以下示例列的表,其数据如下所示。每个帐号都有相应的createddtxmlpayload列值。

在给定的4行中,我需要找到有效的重复项。每个有效帐号都有2 xml行(一个语句和一个pdf xml记录)。如果帐号有2条记录具有相同类型的xml根节点,如pdf record(2335577),则它应该是重复的。如何通过查询xml列来过滤确切的重复项。请帮忙。

Records:  
    AccountNo   **Xmlpayload**  
    2335566     <ns0:Statement xmlns:ns0="uri"><empid>123<empid/><ns0:Statement>
    2335566     <ns0:PDFStmt xmlns:ns0="uri"><empid>123<empid/></ns0:PDFStmt> 
    2335577     <ns0:PDFStmt xmlns:ns0="uri"><empid>123<empid/></ns0:PDFStmt>       
    2335577     <ns0:PDFStmt xmlns:ns0="uri"><empid>123<empid/></ns0:PDFStmt>      
    4332355     <ns0:PDFStmt xmlns:ns0="uri"><empid>123<empid/></ns0:PDFStmt>       
    4332355     <ns0:Statement xmlns:ns0="uri"><empid>123<empid/></ns0:Statement>      
    6723588     <ns0:Statement xmlns:ns0="uri"><empid>123<empid/></ns0:Statement>       
    6723588     <ns0:Statement xmlns:ns0="uri"><empid>123<empid/></ns0:Statement>   

My Expected Output:  
    2335577     <ns0:PDFStmt xmlns:ns0="uri"><empid>123<empid/></ns0:PDFStmt>       
    2335577     <ns0:PDFStmt xmlns:ns0="uri"><empid>123<empid/></ns0:PDFStmt>      
    6723588     <ns0:Statement xmlns:ns0="uri"><empid>123<empid/></ns0:Statement>       
    6723588     <ns0:Statement xmlns:ns0="uri"><empid>123<empid/></ns0:Statement>   

我正在使用SQL 2008 R2版本。

2 个答案:

答案 0 :(得分:1)

对于SQL Server,您可以使用sqlxml中的exist()方法,如下所示:

with xmlnamespaces ('uri' as ns0)
select *
from Table1 as t
where t.Xmlpayload.exist('ns0:PDF[2]') = 1

或者您可以使用xquery count()函数和value()方法:

with xmlnamespaces ('uri' as ns0)
select *
from Table1 as t
where t.Xmlpayload.value('count(ns0:PDF)', 'int') > 1;

<强> sql fiddle demo

<强>更新

如果每个AccountNo都有一个,您可以使用此查询:

with xmlnamespaces ('uri' as ns0)
select *
from Table2 as t
where t.Xmlpayload.exist('ns0:PDFStmt[2]') = 1

如果每个AccountNo有多行(并希望在结果集中获得Xmlpayload):

with
xmlnamespaces ('uri' as ns0),
cte as (
    select
        *, count(*) over(partition by AccountNo) as cnt
    from Table1 as t
    where t.Xmlpayload.exist('ns0:PDFStmt') = 1
)
select *
from cte
where cnt > 1;

<强> sql fiddle demo

答案 1 :(得分:0)

我不是100%想要算什么。我所知道的是,您可以在MSSQL版本中计算XML文件中的节点,如下所示:

declare @xml xml
select @xml= convert(xml,N'<ns0 xmlns:ns0="uri"><empid>123</empid><age>23</age></ns0>
<ns0 xmlns:ns0="uri"><empid>123</empid><age>32</age></ns0>    
<ns0 xmlns:ns0="uri"><empid>123</empid><age>23</age></ns0>
<ns0 xmlns:ns0="uri"><empid>123</empid><age>32</age></ns0>')

select count(*) as nr
from @xml.nodes('root/ns0/empid') as S(N)

请注意我也修改了你的xml因为无效。我改变了     empid&gt; 123 empid /&gt; 在     empid&gt; 123 / empid&gt;

,年龄相同

我删除了:声明和:PDF。这部分是有效的,但我不知道用于搜索这样的throw节点的sysntax,但也适用于它们。