2017-03-09 96 views
1

我有一個表:是否可以在列中操作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

回答

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年的工作......在暫時無法檢查...

+0

就是這樣。謝謝!!! – AngryHacker

相關問題