2012-01-18 16 views
6

ten jest kontynuacją pytanieT-SQL kwerendy XML z nazw

T-Sql xml query

Jeśli dodać obszaru nazw do danych XML, nic nie jest zwracane ponownie.

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) 

Powyższe zapytanie nic nie zwraca. Po drugie, w jaki sposób wybrałbym wszystkie elementy w jednym zaznaczeniu i zwrócił wiersz z wszystkimi elementami jako polami?

chcę wrócić rekord skonstruowanego jak:

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

mógłbyś może przeformułować pytanie nieco? Zakładając, że masz wiele elementów ReportData, chcesz zwrócić elementy jako oddzielne kolumny? Czy mam rację, zakładając, że? – FarligOpptreden

+0

Zmodyfikowaliśmy nieco moje pytanie, mam nadzieję, że pomoże – klashagelqvist

+1

Nie uzyskałem nawet głosu w górę za mój ważny wkład? :( – FarligOpptreden

Odpowiedz

8

Spójrz na 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

Jeszcze raz dziękuję, dla tych, którzy są zainteresowani wersją ostateczną : Z XMLNAMESPACES (DEFAULT 'http://ait.com/reportdata') SELECT [ReportId] = repor tdata.item.value ("./ ReportId [1]", "varchar (40)"), [DocId] = reportdata.item.value ("./ DocId [1]", "varchar (40)") FROM @ xVar.nodes ("/ ReportData") AS dane raportu (element). Chciałbym dać hołd obu jej odpowiedziom, ale nie jestem pewien, czy możesz to zrobić – klashagelqvist

1

Jeśli moje założenia są prawidłowe i chcesz wymienić elementy ALL ReportData w dokumencie XML i chcą, aby ich elementy potomne jak różnych kolumn, można patrzeć na coś takiego:

;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) 

muszę spojrzeć na sprzątanie nazw deklaracjach trochę, ale to wydaje się działać dla mnie ...

EDYCJA: Zmieniono moją odpowiedź za pomocą klauzuli WITH XMLNAMESPACES zgodnie z zaleceniami Martina. :)

+0

dziękuję, działa również dla mnie.Jeśli moglibyśmy tylko pozbyć się tych brzydkich oświadczeń w przestrzeni nazw – klashagelqvist

+0

Widziałem, że istnieje instrukcja WITH XMLNAMESPACES, ale nie mogę tego zmusić do pracy – klashagelqvist

+0

@ user1071785 - er, Moja odpowiedź ma działający przykład z tym (?) –

Powiązane problemy