【发布时间】:2017-03-09 20:31:52
【问题描述】:
我有一张桌子:
create table foo (id int, reportDef xml)
reportDef 列包含一个长 xml 字符串。
<Report>
<Criterias>
<Criteria name="Date Range">...</Criteria>
<Criteria name="Advertisers">
<Elements>
<Element name="CheckBoxOne">
<Value>0</Value>
</Element>
<Element name="ListViewAvailable">
<Value>314</Value>
<Value>57</Value>
<Value>18886</Value>
<Value>7437</Value>
</Element>
</Elements>
</Criteria>
<Criteria name="Revenue Types">...</Criteria>
</Criterias>
</Report>
对于元素 Criteria 的 name 属性为“Advertisers”且元素 Element 的 name 属性为“ListViewAvailable”的情况,我想删除值为 57 和 18886 的 Value 元素。这样在我完成处理后,XML 应该看起来像这样:
<Report>
<Criterias>
<Criteria name="Date Range">...</Criteria>
<Criteria name="Advertisers">
<Elements>
<Element name="CheckBoxOne">
<Value>0</Value>
</Element>
<Element name="ListViewAvailable">
<Value>314</Value>
<Value>7437</Value>
</Element>
</Elements>
</Criteria>
<Criteria name="Revenue Types">...</Criteria>
</Criterias>
</Report>
这可能与 SQL Server,尤其是 2005 版有关吗?到目前为止,我得到了提取可用值的查询,但不知道在哪里继续操作和更新列。
SELECT C.value('.', 'varchar(100)'), t.id
FROM foo t
CROSS APPLY t.reportDef.nodes('
/Report/Criterias/Criteria[@name="Advertisers"]
/Elements/Element[@name="ListViewAvailable"]
/Value
') Z(C)
【问题讨论】:
-
在生成xml之前不能去掉吗?在您的选择声明中?
-
@McNets xml 已经生成并在数据库中。
-
是的,这是可能的。这也相当困难。了解 XPATH 语法和 SQL Server 的 XML 更新语法。
标签: sql sql-server xml sql-server-2005