是否从SQL中XML类型列的某一行中删除元素



假设我有以下内容:

CREATE TABLE tblData ( [SourceID] int, [SourceRecID] bigint, [Value] xml )
GO
INSERT INTO tblData
VALUES
( 1, 0, N'<attributes><attribute id="58" value="0" /><attribute id="86" value="1" /><attribute id="85" value="1" /><attribute id="70" value="0" /><attribute id="38" value="0" /><attribute id="68" value="0" /><attribute id="42" value="1" /><attribute id="67" value="1" /><attribute id="62" value="1" /></attributes>' ), 
( 1, 686, N'<attributes><attribute id="1" value="0.25" /><attribute id="4" value="1" /><attribute id="10" value="3" /><attribute id="11" value="1" /><attribute id="12" value="6" /></attributes>' ), 
( 1, 687, N'<attributes><attribute id="1" value="2.00" /><attribute id="2" value="60.00" /><attribute id="3" value="-1" /><attribute id="5" value="252.00" /><attribute id="6" value="0" /><attribute id="7" value="1" /><attribute id="9" value="1" /><attribute id="10" value="1" /><attribute id="11" value="2" /><attribute id="12" value="10" /></attributes>' ), 
( 1, 688, N'<attributes><attribute id="1" value="2.00" /><attribute id="2" value="60.00" /><attribute id="3" value="-1" /><attribute id="5" value="252.00" /><attribute id="6" value="0" /><attribute id="7" value="1" /><attribute id="11" value="2" /><attribute id="12" value="10" /></attributes>' )
GO
SELECT *
FROM tblData

假设我想从Value列中删除attribute id=7,其中SourceId=1,SourceRecID=687。

我希望行SourceId=1,SourceRecID=687的新值为:

N'<attributes><attribute id="1" value="2.00" /><attribute id="2" value="60.00" /><attribute id="3" value="-1" /><attribute id="5" value="252.00" /><attribute id="6" value="0" /><attribute id="9" value="1" /><attribute id="10" value="1" /><attribute id="11" value="2" /><attribute id="12" value="10" /></attributes>' ), 

请注意,该行的原始xml中现在缺少<attribute id="7" value="1" />

我想不出办法…

您可以尝试:

update tblData 
set 
Value.modify('delete (/attributes/attribute[@id="7"])')
where 
SourceRecID = 687 and 
SourceID = 1

SQL Server的XQuery包含一个扩展XMLDML,它允许修改XML值。在SQL Server中使用XQuery更新XML数据的示例中显示了几个示例。

modify函数用于执行XMLDML查询。在该查询中,delete关键字可用于删除与查询匹配的所有元素

使用以下脚本:

declare @tblData table ( [SourceID] int, [SourceRecID] bigint, [Value] xml );

INSERT INTO @tblData
VALUES
( 1, 0, N'<attributes><attribute id="58" value="0" /><attribute id="86" value="1" /><attribute id="85" value="1" /><attribute id="70" value="0" /><attribute id="38" value="0" /><attribute id="68" value="0" /><attribute id="42" value="1" /><attribute id="67" value="1" /><attribute id="62" value="1" /></attributes>' ), 
( 1, 686, N'<attributes><attribute id="1" value="0.25" /><attribute id="4" value="1" /><attribute id="10" value="3" /><attribute id="11" value="1" /><attribute id="12" value="6" /></attributes>' ), 
( 1, 687, N'<attributes><attribute id="1" value="2.00" /><attribute id="2" value="60.00" /><attribute id="3" value="-1" /><attribute id="5" value="252.00" /><attribute id="6" value="0" /><attribute id="7" value="1" /><attribute id="9" value="1" /><attribute id="10" value="1" /><attribute id="11" value="2" /><attribute id="12" value="10" /></attributes>' ), 
( 1, 688, N'<attributes><attribute id="1" value="2.00" /><attribute id="2" value="60.00" /><attribute id="3" value="-1" /><attribute id="5" value="252.00" /><attribute id="6" value="0" /><attribute id="7" value="1" /><attribute id="11" value="2" /><attribute id="12" value="10" /></attributes>' )

SourceRecID为687的行的内容为:

<attributes>
...
<attribute id="6" value="0" />
<attribute id="7" value="1" />
<attribute id="9" value="1" />
...
</attributes>

执行此查询后:

update tblData 
set Value.modify('delete (/attributes/attribute[@id="7"])')
where [SourceRecID]=687 and SourceID = 1

内容为:

...
<attribute id="5" value="252.00" />
<attribute id="6" value="0" />
<attribute id="9" value="1" />
...

最新更新