2011-10-06 2 views
1

당신은 SQL Server 2005에서이 스크립트를 실행하는 경우 :삭제 여러 노드

id data 
1 <a id="1" /><a id="2" /><a id="3" /><a id="4" /> 

id data 
1 <a id="2" /><a id="3" /><a id="4" /> 

나는이 세 가지를 모두 삭제 기대 :

create table #xmltemp 
(
    id int, 
    data xml null 
) 

insert into #xmltemp 
select 1, '' 

update #xmltemp 
set data.modify('insert <a id="1" /> into /') 
update #xmltemp 
set data.modify('insert <a id="2" /> into /') 
update #xmltemp 
set data.modify('insert <a id="3" /> into /') 
update #xmltemp 
set data.modify('insert <a id="4" /> into /') 

select * from #xmltemp 

update x 
set data.modify('delete //a[@id=sql:column("t.xmlid")]') 
from #xmltemp x 
inner join (
    select 1 as id, 1 as xmlid union 
    select 1 as id, 2 as xmlid union 
    select 1 as id, 3 as xmlid 
) t on t.id = x.id 

select * from #xmltemp 

drop table #xmltemp 

당신은 다음과 같은 출력을 얻을 것이다

id data 
1 <a id="4" /> 

여러 고개를 끄덕을 삭제하는 방법이 있나요 : 오히려 이끌어 냈습니다 첫 번째 선택 반환 이상의 노드 es 하나의 쿼리? 특히, 다른 테이블의 열에서 조건과 일치하는 모든 노드를 삭제하려고합니다 (이 예제에서는 즉석에서 생성되지만 실제로는 실제 테이블이었을 수도 있음).

답변

3

조인 된 쿼리에서 xmlid를 쉼표로 구분 된 문자열로 만들 수 있으며 해당 문자열을 조건 자로 사용할 수 있습니다.

create table #IdToDelete(id int, xmlid int) 
insert into #IdToDelete values (1, 1) 
insert into #IdToDelete values (1, 2) 
insert into #IdToDelete values (1, 3) 
insert into #IdToDelete values (2, 4) 

update x 
set data.modify('delete //a[contains(sql:column("t.xmlid"), @id)]') 
from #xmltemp x 
inner join (
    select D1.id, 
      (select ','+cast(D2.xmlid as varchar(10)) 
      from #IdToDelete as D2 
      where D1.id = D2.id 
      for xml path('')) as xmlid 
    from #IdToDelete as D1 
    group by D1.id 
) t on t.id = x.id 
+0

감사합니다. 방금 서브 쿼리에서 "for xml explicit"을 사용하여 xml을 다시 작성했습니다. – tloflin