2009-04-20 36 views
18

Tôi có một cột xml trong SQL Server 2005 đó là tương đương với:Làm cách nào để chọn thuộc tính cấp cao nhất của cột xml trong SQL Server 2005?

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

Tôi muốn để có thể nhận được giá trị của thuộc tính foo của Test (phần tử gốc) như là một varchar. Mục tiêu của tôi sẽ là một cái gì đó dọc theo dòng:

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

Khi tôi chạy các truy vấn trên tôi nhận được lỗi sau:

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

Trả lời

39

John Saunders có nó gần như ngay :-)

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

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

Điều này phù hợp với tôi (SQL Server 2005 và 2008)

Marc

+0

gì xảy ra nếu bạn không biết những gì các phần tử gốc là .. ??? trong trường hợp này chúng ta biết nó là "Test", nhưng tôi có một trường XML có XML khác nhau tùy thuộc vào giá trị trong một trường khác. do đó, nó có thể là hoặc ... có tên phần tử gốc mặc định mà chúng tôi có thể sử dụng không .. ??? – Ads

+2

@Quảng cáo sử dụng ký tự đại diện, ví dụ: '// Element [@foo]' hoặc nếu bạn biết gì đó về cấu trúc '/ */Elements/Element [@foo]' – StuartLC

+0

Quấn truy vấn trong các lần parens. Sheesh; Tôi sẽ không bao giờ đoán được. Truy vấn XML trong TSQL hoạt động tốt, nhưng cú pháp là quá khó. – dudeNumber4

3

Nếu bạn không biết phần tử gốc:

select @Data.value('(/*/@foo)[1]','varchar(20)') as Foo 
Các vấn đề liên quan