2009-04-20 5 views
18

Ich habe eine XML-Spalte in SQL Server 2005, die das Äquivalent ist:Wie wähle ich ein Attribut der obersten Ebene einer XML-Spalte in SQL Server 2005 aus?

<Test foo="bar"> 
    <Otherstuff baz="belch" /> 
</Test> 

Ich möchte den Wert der foo Attribut-Test erhalten können (das Wurzelelement) als varchar. Mein Ziel wäre etwas entlang der Linien der folgenden sein:

select cast('<Test foo="bar"><Otherstuff baz="belch" /></Test>' as xml).value('@foo','varchar(20)') as Foo 

Wenn ich ausführen, um die obige Abfrage ich die folgende Fehlermeldung erhalten:

Msg 2390, Level 16, State 1, Line 1 XQuery [value()]: Top-level attribute nodes are not supported

Antwort

39

John Saunders hat es fast richtig :-)

declare @Data XML 
set @Data = '<Test foo="bar"><Otherstuff baz="belch" /></Test>' 

select @Data.value('(/Test/@foo)[1]','varchar(20)') as Foo 

Das funktioniert für mich (SQL Server 2005 und 2008)

Marc

+0

was, wenn Sie nicht wissen, was das Wurzelelement ist .. ??? In diesem Fall wissen wir, dass es "Test" ist, aber ich habe ein XML-Feld, das abhängig vom Wert in einem anderen Feld ein anderes XML hat. also könnte es oder ... gibt es einen Standard-Root-Element-Namen, den wir verwenden können .. ??? – Ads

+2

@Ads verwenden einen Platzhalter, z. '// Element [@foo]' oder wenn Sie etwas über die Struktur wissen ''/*/Elements/Element [@foo] ' – StuartLC

+0

Wickeln Sie die Abfrage in Parens. Sheesh; Ich hätte es nie gedacht. Die XML-Abfrage in TSQL funktioniert großartig, aber die Syntax ist viel zu schwierig. – dudeNumber4

3

Wenn Sie das Stammelement nicht wissen:

select @Data.value('(/*/@foo)[1]','varchar(20)') as Foo