このスクリプトを SQL Server 2005 で実行すると、次のようになります。
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="1" /><a id="2" /><a id="3" /><a id="4" />
id data
1 <a id="2" /><a id="3" /><a id="4" />
最初のノードだけでなく、3 つのノードすべてを削除して、2 番目の選択を返すことを期待します。
id data
1 <a id="4" />
単一のクエリで複数のノードを削除する方法はありますか? 具体的には、別のテーブルの列から基準に一致するすべてのノードを削除したいと考えています (この例では、t はオンザフライで作成されますが、実際のテーブルでも同じように簡単に削除できます)。