2008-09-17 2 views
2

sagen, dass ich diese Tabelle (SQL Server 2005) haben:Wie kann ich den Inhalt eines XML-Felds als Recordset zurückgeben?

Id => integer 
MyField => XML 

Id MyField

1 < Object>< Type>AAA< /Type>< Value>10< /Value>< /Object>< Object>< Type>BBB< /Type><Value>20< /Value>< /Object> 
2 < Object>< Type>AAA< /Type>< Value>15< /Value>< /Object> 
3 < Object>< Type>AAA< /Type>< Value>20< /Value>< /Object>< Object>< Type>BBB< /Type>< Value>30< /Value>< /Object> 

ich eine TSQL Abfrage benötigen, die so etwas wie dies zurückkehren würde:

Id AAA  BBB 
1 10  20 
2 15  NULL 
3 20  30 

Beachten Sie, dass ich nicht wissen werde, ob im Voraus wie viele 'Type' (zB AAA, BBB, CCC, DDD, etc.) wird in der XML-Zeichenfolge sein .

+0

Beachten Sie, dass ich nicht wissen werde, ob im Voraus wie viele "Typ" (zB AAA, BBB, CCC, DDD, etc.) wird in der XML-Zeichenfolge sein. – Anthony

+0

müssen Sie dann am wahrscheinlichsten dynamische sql und cursors verwenden. keine einzige Aussage, um zu bekommen, was du willst, denke ich nicht. –

Antwort

1

Sie müssen dazu die XML querying in sql server verwenden. wenn die 100% richtig xquery Syntax, aber es wird so etwas sein

Somethings wie

select id, MyField.query('/Object/Type[.="AAA"]/Value') as AAA, MyField.query('/Object/Type[.="BBB"]/Value) AS BBB 

nicht sicher.

0

Eine mögliche Option ist die Verwendung des XMLDataDocument. Mit dieser Klasse können Sie die Daten als XML abrufen, sie in XmlDataDocument laden und dann mit der Dataset-Eigenschaft auf sie zugreifen, als ob es sich um ein Standard-Dataset handeln würde.

0

Sie müssen CROSS APPLY verwenden. Hier ist ein Beispiel auf der Grundlage Ihrer Anfrage:

declare @y table (rowid int, xmlblock xml) 
insert into @y values(1,'<Object><Type>AAA</Type><Value>10</Value></Object><Object><Type>BBB</Type><Value>20</Value></Object>') 
insert into @y values(2,'<Object><Type>AAA</Type><Value>15</Value></Object>') 
insert into @y values(3,'<Object><Type>AAA</Type><Value>20</Value></Object><Object><Type>BBB</Type><Value>30</Value></Object>') 

select y.rowid, t.b.value('Type[1]', 'nvarchar(5)'), t.b.value('Value[1]', 'int') 
from @y y CROSS APPLY XmlBlock.nodes('//Object') t(b) 

Oh, und Ihr Beispiel XML ungültig ist, die erste Zeile für Type BBB die Öffnung Value Element fehlt.

Verwandte Themen