【问题标题】:Is it possible to manipulate xml in a column?是否可以在列中操作 xml?
【发布时间】: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


【解决方案1】:

这是你要找的吗?

DECLARE @foo TABLE(id INT,reportDef XML);
INSERT INTO @foo VALUES(1,
N'<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>');

SELECT * FROM @foo;

UPDATE @foo SET reportDef.modify(N'delete /Report/Criterias/Criteria[@name="Advertisers"]/Elements/Element[@name="ListViewAvailable"]/Value[text()="57" or text()="18886"]');

SELECT * FROM @foo;

恐怕这在 2005 年可能行不通...目前无法检查...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-25
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多