2009-08-03 6 views
2

haben Sie eine SQL-Tabelle mit 2 Spalten. ID (int) und Wert (ntext)Wie aktualisiere ich eine XML-Zeichenfolge in einer Ntext-Spalte in SQL Server?

Die Wertzeilen enthalten alle Arten von XML-Zeichenfolgen.

ID Value 
-- ------------------ 

1 <ROOT><Type current="TypeA"/></ROOT> 
2 <XML><Name current="MyName"/><XML> 
3 <TYPE><Colour current="Yellow"/><TYPE> 
4 <TYPE><Colour current="Yellow" Size="Large"/><TYPE> 
5 <TYPE><Colour current="Blue" Size="Large"/><TYPE> 
6 <XML><Name current="Yellow"/><XML> 

Wie kann ich:

A. Liste der Zeilen, in denen

`<TYPE><Colour current="Yellow",` 
    bearing in mind that there is an entry 
    <XML><Name current="Yellow"/><XML> 

B. die Zeilen ändern, die

<TYPE><Colour current="Yellow" to be 
<TYPE><Colour current="Purple" 

Dank enthalten! 4 Ihre Hilfe

Antwort

1

Da es sich um ein NTEXT-Feld handelt, können Sie leider keine der üblichen Zeichenfolgenfunktionen verwenden.

Welche Version von SQL Server verwenden Sie?

Wenn Sie auf SQL Server 2005 sind und, haben Sie zwei Möglichkeiten:

  • Sie Ihre NTEXT zu NVARCHAR (MAX) gegossen und dann können Sie alle üblichen String-Funktionen wie REPLACE verwenden, SUBSTRING und so weiter
  • können Sie Ihre NTEXT zu XML umgewandelt und die XML-Funktionen für SQL Server verwenden 2005

Die erste Option könnte wie folgt aussehen:

Für die zweite Option finden Sie Quasnoi Antwort - aber beachten Sie: Ihre XML ist ein wenig seltsam .....

<TYPE><Colour="Yellow" Size="Large"></TYPE> 

etwas ungewöhnlich ist und meiner Meinung nach ungültig - entweder die " Color“ist ein Attribut auf den <TYPE> Tag

<TYPE Colour="Yellow" Size="Large"></TYPE> 

oder dann <Colour> an sich einen XML-Tag ist aber dann das "Gelb" muss mit einem Attribute zugewiesen werden:

Sie können dem XML-Tag nicht direkt einen Wert zuweisen, wie Sie es in Ihrem XML, IMHO, tun.

Wenn Sie auf SQL Server sind 2000 Dinge werden viel härter bekommen ....

Marc

+0

korrigierte ich meine XML, danke. –

4

In SQL Server 2005+, einen Vermittler temporäre Tabelle:

DECLARE @q AS TABLE (xid INT NOT NULL, xdoc XML NOT NULL, modified TINYINT NOT NULL DEFAULT 0) 

INSERT 
INTO @q (xid, xdoc) 
SELECT id, doc 
FROM mytable 

UPDATE @q 
SET  xdoc.modify('replace value of (/TYPE/@Colour)[1] with "blue"'), 
     modified = 1 
WHERE xdoc.value('(/TYPE/@Colour)[1]', 'NVARCHAR(MAX)') = 'Yellow' 

UPDATE mytable 
SET  doc = CAST(xdoc AS NVARCHAR(MAX)) 
FROM @q q 
WHERE id = q.xid 
     AND q.modified = 1 
+0

wollte Ihnen sagen "Filter auf" Gelb "fehlt in der UPDATE", aber die ganze XML-Sache ist in OP – devio

+0

@devio vermasselt: Dieser Filter wird sowieso nicht weh tun. Vielen Dank. – Quassnoi

+0

@Quassnoi: Was sollte er tun, wenn er mit einer NTEXT-Spalte fest ist? –

Verwandte Themen