hueni4u
Goto Top

MSSQL 2005 - XML-Feld Inhalt ändern

Braeuchte Hilfe bei der Erstellung eines Querys für SQL-Server 2005.

Habe eine Tabelle mit einer XML-Spalte 'Lagerverteilung' mit diesem Aufbau.
<Root>
<Row>
<Lager>1</Lager>
<Menge>1</Menge>
</Row>
<Row>
<Lager>2</Lager>
<Menge>1</Menge>
</Row>
</Root>

Nun muesste ich einen Update absetzen, dass die Werte der Ebene Lager von '1' auf '1A' ändert.

Ist sowas machbar ?

Content-ID: 48271

Url: https://administrator.de/contentid/48271

Ausgedruckt am: 15.11.2024 um 09:11 Uhr

Biber
Biber 15.01.2007 um 08:11:25 Uhr
Goto Top
Moin hueni4u,

ich bin nicht sicher, ob ich Deinen Tabellenaufbau vollständig begreifen bzw begreifen kann.
Aber wenn wirklich das wirklich ein Textfeld Varchar(2000) oder so etwas ist, in dem eine komplette XML-Struktur abgelegt ist, dann...
UPDATE <i>tabellenname</i>
Set Lagerverteilung = Replace(Lagerverteilung, "<Lager>1</Lager>", "<Lager>1A</Lager>"  

Ich hoffe allerdings irgendwie, ich habe die Tabellenstruktur missverstanden...

Gruß
Biber
hueni4u
hueni4u 15.01.2007 um 12:10:59 Uhr
Goto Top
Hallo Biber,

vielen Dank für Deine Antwort.

Vielleicht muss ich erst mal die Hintergründe hierfür posten:
- Das Ganze ist im Moment ein Clipper-Programm mit Dbase-Datenbank in der einige Informationen (z.B. Lagerverteilung) in einem Array gespeichert sind.

- Dieses Clipper-Programm wird nun ersetzt durch eine Software (Xbase++) der eine MSSQL2000 zu Grunde liegt. Beim Konvertieren der Daten werden die Arrays in eine Tabellenspalte von Typ "Text" geschrieben, mit eben jener Struktur.

- Programmintern ist diese XML-Struktur definiert, aber nicht auf Datenbankebene.

Das war die Vorgeschichte.
Das Ganze hat mir schon immer Kopfzerbrechen bereitet:
- keine Querys auf diese Spalten
- keine Indizies, usw.

Nun war ich zuversichtlich, dass mit SQL2005 und XQuery alles besser wird.

P.S. Dein Beispiel scheint nicht auf einer "Text"-Spalte zu funktionieren...
Biber
Biber 15.01.2007 um 19:24:20 Uhr
Goto Top
Moin hueni4me,

ich habe gerade folgendes an einer SQL-Datenbank (Nicht-M$) ohne Fehlermeldungen oder unerwartete Ergebnisse durchgenudelt:
create table temp (
text1 varchar(1000),
text2 char(200)
) ;
insert into temp(text1, text2) values (
'<Root>  
<Row>
<Lager>1</Lager>
<Menge>1</Menge>
</Row>
<Row>
<Lager>2</Lager>
<Menge>1</Menge>
</Row>
</Root>',  
'<Root>  
<Row>
<Lager>1</Lager>
<Menge>1</Menge>
</Row>
<Row>
<Lager>2</Lager>
<Menge>1</Menge>
</Row>
</Root>'  
);
Update temp set text1 = replace( text1, '<Lager>1</Lager>', '<Lager>1A</Lager>');  
Update temp set text2 = replace( text2, '<Lager>1</Lager>', '<Lager>1A</Lager>');  
select * from temp;

der Part '<Lager>1</Lager>' war hinterher sowohl im CHAR-Feld wie auch im VARCHAR-Feld mit '<Lager>1A</Lager>' ersetzt.

Meines Wissens nach kennt und akzeptiert M$SQL sowohl die STUFF()- wie auch die REPLACE()- Skalarfunktion... sollte also eigentlich funktionieren.

Da es das aber offensichtlich bei Dir nicht tut:
Wie lautet denn die Fehlermeldung?
Oder passiert einfach nur nix?

Grüße
Biber
hueni4u
hueni4u 16.01.2007 um 09:00:04 Uhr
Goto Top
Tach Biber,

mein Feld is vom "Text"-Datentyp. Also wie text3:
create table temp (
text1 varchar(1000),
text2 char(200),
text3 text
) ;
...
Update temp set text3 = replace( text3, '<Lager>1</Lager>', '<Lager>1A</Lager>');  
Hiernach kommt die Fehlermeldung:
"Der Argumentdatentyp text ist für das Argument 1 der replace-Funktion ungültig."

Wird wohl doch keine Möglichkeit geben...