2009-08-03 5 views
2

avoir une table SQL avec 2 colonnes. ID (int) et Value (ntext)Comment mettre à jour une chaîne XML dans une colonne ntext dans SQL Server?

Les lignes de valeur contiennent toutes sortes de chaînes XML.

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> 

Comment puis-je:

A. Liste des lignes où

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

B. Modifier les lignes qui contiennent

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

Merci! 4 votre aide

Répondre

1

Comme il s'agit d'un champ NTEXT, vous ne pouvez malheureusement pas utiliser les fonctions de chaîne habituelles.

Quelle version de SQL Server utilisez-vous?

Si vous êtes sur SQL Server 2005 et, vous avez deux options:

  • vous pouvez lancer votre NTEXT à NVARCHAR (MAX) et vous pouvez utiliser toutes les fonctions de chaîne habituelles comme REPLACE, SUBSTRING et ainsi de suite
  • vous pouvez lancer votre NTEXT XML et utiliser les fonctions XML disponibles pour SQL Server 2005

La première option pourrait ressembler à ceci:

UPDATE 
    YourTable 
SET 
    Value = CAST(REPLACE(CAST(Value as NVARCHAR(MAX)), 
         'Colour="Yellow"', 'Colour="Blue"') AS NTEXT) 
WHERE 
    ....... 

Pour la deuxième option, voir la réponse de Quasnoi - cependant, l'esprit vous: votre XML est un peu bizarre .....

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

est un peu inhabituel et dans mon opinion invalide - soit la " couleur » est un attribut sur l'étiquette <TYPE>

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

ou alors <Colour> en lui-même est une balise XML mais le « jaune » doit être affecté à un attribut :

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

Vous ne pouvez pas affecter une valeur directement à la balise XML comme vous le faites dans votre XML, à mon humble avis.

Si vous êtes sur SQL Server 2000, les choses vont beaucoup plus difficiles ....

Marc

+0

Je corrigeais mon XML, merci. –

4

En SQL Server 2005+, en utilisant une table temporaire intermédiaire:

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

voulait vous dire "filtre sur" jaune "est manquant dans la mise à jour", mais l'ensemble de la chose XML est foiré dans OP – devio

+0

@devio: ce filtre ne fera pas mal de toute façon. Merci. – Quassnoi

+0

@Quassnoi: que devrait-il faire étant donné qu'il est coincé avec une colonne NTEXT? –

Questions connexes