Ich muss E-Mail Subject
aus einer XML
als gespeichert extrahieren.Extrahieren von Daten aus XML gespeichert als Nvarchar
Ich bin mit dieser Abfrage:
SELECT rtrim((SELECT CAST(
SUBSTRING(
[XML]
,patindex('%<SUBJECT>%', [XML])
,patindex('%</SUBJECT>%', [XML])-patindex('%<SUBJECT>%', [XML])+len('</SUBJECT>')
) as XML).value('(/SUBJECT/OPTION)[1]','nvarchar(2000)')
FROM dbo.Mails
)) as SUBJECT
Was diese Abfrage tun, ist zunächst die Zeichenfolge zu extrahieren, die E-Mail-Betreff enthält (<SUBJECT>....</SUBJECT>
), die ich in XML konvertieren und dann den Betreff Wert erhalten mit value
Funktion XML.
Dies funktioniert gut, aber in einigen Fällen ist das XML nicht gut gebildet und das Parsen schlägt fehl. Beispiel:
DECLARE @XMLData XML = '<SUBJECT>
<OPTION CONSTRAINT="MASTER.IN_TITLE = '' OR MASTER.IN_LASTNAME = ''"><![CDATA[Découvrez nos offres de location]]>
</OPTION>
<OPTION CONSTRAINT="IN_TITLE <> '' AND MASTER.IN_LASTNAME <> ''"><![CDATA[~IN_TITLE~ ~IN_LASTNAME~, découvrez nos offres de location]]>
</OPTION>
</SUBJECT>'
select rtrim((@XMLData).value('(/SUBJECT/OPTION)[1]','nvarchar(2000)'))
Hier im Option
Attribut Constraint
Ich habe einen besonderen Charakter <
, Wenn ich versuche, diesen Charakter zu entkommen sie alle anderen Charakter entkommt und ich verlor die XML-Struktur. Wie kann man dem entkommen?
Ein weiteres Beispiel ist dies:
DECLARE @XMLData XML = '<SUBJECT>
<OPTION NAME="DEFAULT"><![CDATA[~(IF((IN_TITLE<>'' AND IN_LASTNAME<>''),IN_TITLE&' '&IN_LASTNAME&',',''))~ nos plus belles réalisations de 2015]]>
</OPTION>
</SUBJECT>'
select rtrim((@XMLData).value('(/SUBJECT/OPTION)[1]','nvarchar(2000)'))
Hier habe ich Fehler in der Nähe von &IN_LASTNAME&
aber ich dachte, dass wir Sonderzeichen nicht in CDATA
entkommen müssen!
Hat jemand eine Lösung, um diese Fehler beim Parsen zu vermeiden?
Nein, die Generierung des XML ist nicht unter meiner Kontrolle, also muss ich damit umgehen. Ersetzen Sie das '<>' behoben das Problem. Vielen Dank. – blackbishop