2017-03-09 5 views
1

Ich habe eine Tabelle:Ist es möglich, XML in einer Spalte zu manipulieren?

create table foo (id int, reportDef xml) 

Spalte reportDef eine lange XML-Zeichenfolge enthält.

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

Für Situationen, in denen Name des Elements Kriterien Attribut ist „Werbetreibende“ und Element Element Name des Attributs „ListViewAvailable“, möchte ich Wert Elemente entfernen, wo der Wert 57 und 18886. So, nachdem ich mit der Verarbeitung fertig bin sollte die XML wie folgt aussehen:

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

Ist dies möglich mit SQL Server, insbesondere Version 2005 zu tun? Bisher habe ich die Abfrage erhalten, um die verfügbaren Werte zu extrahieren, aber keine Ahnung, wo mit der Manipulation und dem Aktualisieren der Spalte fortgefahren werden soll.

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

Kann es nicht entfernen, bevor xml zu generieren? Auf Ihrer Select-Anweisung? – McNets

+0

@McNets Das XML ist bereits generiert und befindet sich in der Datenbank. – AngryHacker

+1

Werfen Sie einen Blick auf Werte ersetzen https://www.mssqltips.com/sqlservertip/2738/example-of-using-xquery-to-update-xml-data-in-sql-server/ – McNets

Antwort

1

Ist es das, wonach Sie suchen?

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; 

Ich fürchte, dass dies nicht auf 2005 funktionieren könnte ... Kann es zur Zeit nicht überprüfen ...

+0

Das ist es genau. Vielen Dank!!! – AngryHacker

Verwandte Themen