2017-03-09 25 views
1

私はテーブルを持っている:xmlを列で操作することは可能ですか?

create table foo (id int, reportDef xml) 

reportDefは長いXML文字列が含まれています。要素条件のname属性は、私は私が処理を行っています後ようにするには値が57と18886.されている値の要素を削除する、「広告主」と要素要素のname属性は「ListViewAvailable」である状況では

<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> 

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

は、それを削除することができませんか?あなたのselectステートメントで? – 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

これはあなたが探しているのですか? XMLを生成する前に、

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

関連する問題