Zerkleinern von XML in SQL server von NTEXT

Hoffentlich ist das ein einfacher für Experten 🙂

Ich habe eine Spalte mit XML (am unteren Rand dieses Beitrags) – die Spalte ist von ntext datatyp. Anstatt die gesamte XML-characterfolge in einer Spalte anzuzeigen, möchte ich sie in mehrere Spalten zerreißen. Die database ist SQL server 2008 R2. Spaltendatentyp kann nicht geändert werden (MS Application DB)

Ich habe versucht, mehrere Variationen von xpath Abfragen, aber ich habe immer Nullwerte. Hoffentlich ist es nur so, wie ich es referenziere, was falsch ist. Jede mögliche Hilfe würde sehr geschätzt werden, da ich nicht meinen Kopf um XML erhalten kann, scheint es (nicht durch Mangel an Versuch!):

XML (Beispiel aus einem datasatz im Ergebnis – ich habe es für die Leichtigkeit des Lesens split):

 <?xml version="1.0" encoding="utf-16"?> <q1:ErrorInfo ErrorCode="1073744938" DetailedCode="0" DetailedSource="0" ExceptionDetails="" xmlns:q1="http://schemas.microsoft.com/2003/dls/GenericAgentStatus.xsd"> <q1:Parameter Name="datasourceid" Value="48c3db91-4ba9-46a5-820b-a2ab2c0733aa" /> <q1:Parameter Name="doesalertneedstroubleshootuiformoredetails" Value="False" /> <q1:Parameter Name="failurecount" Value="1" /> <q1:Parameter Name="customparameterformom" Value="86924" /> <q1:Parameter Name="datasourcename" Value="servername\database1" /> <q1:Parameter Name="protectedgroup" Value="ProtectionGroup1 servers - servername.domain" /> <q1:Parameter Name="servername" Value="servername.domain" /> </q1:ErrorInfo> 

SQL, mit dem ich arbeite (null Werte zurückgegeben):

 WITH XMLNAMESPACES('http://schemas.microsoft.com/2003/dls/GenericAgentStatus.xsd' as q1) select cast(ErrorXml as XML).value('(/q1:ErrorInfo/q1:Parameter[6]/q1:value[0]/text())[1]','varchar(MAX)') as [servername] from target_table 

Am Ende von all dem möchte ich servername, geschützte Gruppe, datasource name aufteilen.

Irgendwelche Hinweise darauf, wo ich falsch gehe, würde massiv geschätzt.

Danke im Voraus

Nun, leider, es scheint, ich kann nicht einen Kommentar als Antwort markieren – casting Sie einen Blick auf SO Foren und das ist von Design. Kudos zu beiden Kommentaren für diesen Beitrag.

Die Lösung, die ich verwende, ist von Har07 aber ich habe die Lösung von Marcus probiert und das hat auch perfekt geklappt.

Mein überarbeiteter Code sieht jetzt so aus … und funktioniert perfekt:

  select cast(ls.ErrorXml as XML).value('(/q1:ErrorInfo/q1:Parameter[6]/@Value)[1]','varchar(MAX)') as [serverName], cast(ls.ErrorXml as XML).value('(/q1:ErrorInfo/q1:Parameter[5]/@Value)[1]','varchar(MAX)') as [ProtectedGroup], cast(ls.ErrorXml as XML).value('(/q1:ErrorInfo/q1:Parameter[4]/@Value)[1]','varchar(MAX)') as [DataSourceName], 

Danke Lasten wieder – sparte mir so viel time und Vernunft!

Im Allgemeinen, in XPath verwenden Sie @attributeName , um XML-Attribut zu wählen, können Sie versuchen, diese Weise:

 /q1:ErrorInfo/q1:Parameter[6]/@Value