2012-01-18 13 views
6

Ésta es una pregunta de seguimiento aT-consulta SQL XML con espacio de nombres

T-Sql xml query

Si añado un espacio de nombres a los datos XML, no se devuelve nada nuevo.

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) 

La consulta anterior no devuelve nada. En segundo lugar, ¿cómo seleccionaría todos los elementos en una sola selección y devolvería una fila con todos los elementos como campos?

Quiero devolver un registro construido como el siguiente:

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

Podría tal vez reformular la pregunta un poco? Suponiendo que tiene varios elementos ReportData, ¿desea devolver los elementos como columnas separadas? ¿Estoy en lo correcto al asumir eso? – FarligOpptreden

+0

Modifiqué mi pregunta un poco, espero que ayude – klashagelqvist

+1

¿Ni siquiera un voto positivo para mi contribución válida? :( – FarligOpptreden

Respuesta

8

Mira 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

Gracias de nuevo, para aquellos que estén interesados ​​en la versión final : CON XMLNAMESPACES (DEFAULT 'http://ait.com/reportdata') SELECCIONAR [ReportId] = informe tdata.item.value ('./ ReportId [1]', 'varchar (40)'), [DocId] = reportdata.item.value ('./ DocId [1]', 'varchar (40)') DES @ xVar.nodes ('/ ReportData') AS reportdata (elemento). Desearía poder rendir homenaje a ambas respuestas pero no estoy seguro de que puedas hacer eso – klashagelqvist

1

Si mis suposiciones son correctas y que desea listar todos los elementos ReportData en el documento XML y quieren que sus elementos secundarios como diferentes columnas, usted podría mirar algo como esto:

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

voy a tener que mirar a la limpieza del espacio de nombres de declaraciones un poco, pero parece que funciona para mí ...

EDITAR: Enmendé mi respuesta con la cláusula WITH XMLNAMESPACES recomendada por Martin. :)

+0

Gracias, funciona para mí también. Si solo pudiéramos deshacernos de esas molestas declaraciones de espacio de nombres – klashagelqvist

+0

He visto que hay una declaración WITH XMLNAMESPACES, pero parece que no puedo hacer que funcione – klashagelqvist

+0

@ user1071785 - er, Mi respuesta ha un ejemplo de trabajo con eso (?) –

Cuestiones relacionadas