是否可以在列中操作xml?

问题描述:

我有一个表:是否可以在列中操作xml?

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> 

对于那些元素标准的name属性是“广告”和元素元素的name属性是“ListViewAvailable”的情况下,我想删除的价值元素,其中的值是57和18886.所以,我有处理完成后, ,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) 
+0

无法将其删除之前生成XML?在你的选择声明? – McNets

+0

@McNets xml已经生成并位于数据库中。 – AngryHacker

+1

看看替换值https://www.mssqltips.com/sqlservertip/2738/examples-of-using-xquery-to-update-xml-data-in-sql-server/ – McNets

这是您要找的吗?

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年的工作......在暂时无法检查...

+0

就是这样。谢谢!!! – AngryHacker