2012-01-18 32 views
6

Đây là một theo dõi câu hỏi đểT-Sql query xml với namespace

T-Sql xml query

Nếu tôi thêm một namespace để dữ liệu xml, không có gì lại được lặp lại.

DECLARE @xVar XML 
SET @xVar = 
    '<ReportData ObjectId="123" xmlns="http://ait.com/reportdata"> 
    <ReportId>AAAA-BBBB-CCCCC-DDDDD</ReportId> 
    <DocId>100</DocId> 
    <ReportName>Drag Scraper Troubleshooting</ReportName> 
    <DocType>Name</DocType> 
    <StatusId>1</StatusId> 
    <AuthorId>1</AuthorId> 
    </ReportData>' 

SELECT [ReportId]= reportdata.item.value('.', 'varchar(40)') 
FROM @xVar.nodes('/ReportData/ReportId[1]') AS reportdata(item) 

Truy vấn trên không trả về gì cả. Thứ hai, làm thế nào tôi sẽ chọn tất cả các phần tử trong một lựa chọn duy nhất và trả về một hàng với tất cả các phần tử như là các trường?

Tôi muốn quay trở lại mức kỷ lục xây dựng như sau:

ReportId    | DocId | ReportName | 
AAAA-BBBB-CCCCC-DDDDD | 100 | AAAA-BBBB-CCCCC-DDDDD | 
+0

thể bạn có thể diễn đạt lại câu hỏi một chút? Giả sử bạn có nhiều phần tử ReportData, bạn muốn trả lại các phần tử dưới dạng các cột riêng biệt? Tôi có đúng không? – FarligOpptreden

+0

Đã sửa đổi câu hỏi của tôi một chút, hy vọng điều này sẽ giúp – klashagelqvist

+1

Thậm chí không có quyền bỏ phiếu cho khoản đóng góp hợp lệ của tôi? :( – FarligOpptreden

Trả lời

8

Nhìn vào WITH XMLNAMESPACES

;WITH XMLNAMESPACES(DEFAULT 'http://ait.com/reportdata') 
SELECT [ReportId]= reportdata.item.value('.', 'varchar(40)') 
FROM @xVar.nodes('/ReportData/ReportId[1]') AS reportdata(item) 
+0

Cảm ơn một lần nữa, cho những ai quan tâm đến phiên bản cuối cùng : VỚI XMLNAMESPACES (DEFAULT 'http://ait.com/reportdata') CHỌN [ReportId] = repor tdata.item.value ('./ ReportId [1]', 'varchar (40)'), [DocId] = reportdata.item.value ('./ DocId [1]', 'varchar (40)') FROM @ xVar.nodes ('/ ReportData') AS reportdata (mục). Tôi ước tôi có thể cống nạp cho cả hai câu trả lời của cô ấy nhưng không chắc chắn bạn có thể làm điều đó – klashagelqvist

1

Nếu giả thiết của tôi là chính xác và bạn muốn liệt kê các yếu tố ALL ReportData trong tài liệu XML của bạn và muốn phần tử con của họ như là các cột khác nhau, bạn có thể nhìn vào một cái gì đó như thế này:

;WITH XMLNAMESPACES(DEFAULT 'http://ait.com/reportdata') 
SELECT 
    [ReportId] = reportdata.item.value('(./ReportId)[1]', 'varchar(40)') 
    , [DocId] = reportdata.item.value('(./DocId)[1]', 'varchar(40)') 
    , [ReportName] = reportdata.item.value('(./ReportName)[1]', 'varchar(40)') 
    , [DocType] = reportdata.item.value('(./DocType)[1]', 'varchar(40)') 
    , [StatusId] = reportdata.item.value('(./StatusId)[1]', 'varchar(40)') 
    , [AuthorId] = reportdata.item.value('(./AuthorId)[1]', 'varchar(40)') 
FROM @xVar.nodes('//ReportData') AS reportdata(item) 

tôi sẽ cần phải nhìn vào dọn dẹp không gian tên tờ khai một chút, nhưng có vẻ như để làm việc cho tôi ...

EDIT: Sửa đổi câu trả lời của tôi với mệnh đề WITH XMLNAMESPACES theo khuyến cáo của Martin. :)

+0

cảm ơn, làm việc cho tôi quá.Nếu chúng tôi chỉ có thể loại bỏ những tuyên bố không gian tên pesky – klashagelqvist

+0

Tôi đã thấy có một tuyên bố VỚI XMLNAMESPACES, nhưng tôi không thể dường như làm cho nó hoạt động – klashagelqvist

+0

@ user1071785 - er, Câu trả lời của tôi có một ví dụ làm việc với điều đó (?) –

Các vấn đề liên quan