Ich habe eine Varchar-Spalte in einer Tabelle, die zum Speichern von XML-Daten verwendet wird. Ja, ich weiß, dass es einen XML-Datentyp gibt, den ich verwenden sollte, aber ich denke, dass dies eingerichtet wurde, bevor der XML-Datentyp verfügbar war, so dass ich jetzt einen Varchar verwenden muss. :)SQL Server Xml-Zeichenfolge in Varchar-Feld analysieren
Die gespeicherten Daten sieht ähnlich wie die folgende:
<xml filename="100100_456_484351864768.zip"
event_dt="10/5/2009 11:42:52 AM">
<info user="TestUser" />
</xml>
Ich brauche den Dateinamen zu analysieren, die Ziffern zwischen den zwei Unterstrichen zu erhalten, die in diesem Fall wäre „456“. Der erste Teil des Dateinamens "sollte nicht" in der Länge ändern, aber die mittlere Nummer wird. Ich brauche eine Lösung, die funktioniert, wenn sich der erste Teil ändert (Sie wissen, dass sich das ändert, weil "sich nicht ändern sollte" immer bedeutet, dass es sich ändert).
Für das, was ich für jetzt habe, benutze ich XQuery, um den Dateinamen herauszuziehen, weil ich dachte, das ist wahrscheinlich die bessere als gerade String-Manipulation. Ich übergebe die Zeichenkette dafür nach xml, aber ich bin kein XQuery-Experte, daher stoße ich natürlich auf Probleme. Ich habe eine Funktion für XQuery (substring-before) gefunden, konnte sie aber nicht zum Laufen bringen (ich bin mir nicht einmal sicher, ob die Funktion mit SQL Server funktioniert). Es könnte eine XQuery-Funktion geben, um das leicht zu machen, aber wenn es da ist, bin ich mir dessen nicht bewusst.
So, erhalte ich die Dateinamen aus der Tabelle mit einer Abfrage ähnlich den folgenden:
select CAST(parms as xml).query('data(/xml/@filename)') as p
from Table1
Daraus Ich gehe davon aus, dass würde ich in der Lage sei, diese wieder in einen String CAST dann einige tun Instring oder Charindex-Funktion, um herauszufinden, wo die Unterstriche sind, so dass ich all das in einer Teilstring-Funktion kapseln kann, um den Teil herauszusuchen, den ich brauche. Ohne zu weit zu gehen, bin ich mir ziemlich sicher, dass ich es auf diese Weise schaffen kann, aber ich weiß, dass es einen einfacheren Weg geben muss. Auf diese Weise würde in der SQL-Anweisung ein großes unlesbares Feld entstehen, das selbst dann, wenn ich es in eine Funktion verschieben würde, immer noch verwirrend sein würde, um herauszufinden, was vor sich geht.
Ich bin mir sicher, es gibt ein einfacher als das, da es scheint, einfache String-Manipulation. Vielleicht kann mich jemand in die richtige Richtung weisen. Danke
Welche Version von SQL Server? –
Entschuldigung, ich habe diesen Kommentar erst jetzt gesehen. Wir verwenden jetzt SQL Server 2008. – Dusty