locked
Ayuda Urgente 'FOR XML' RRS feed

  • Pregunta

  • Buenos días a tod@s!!

    Perdonadme que sea tan directo pero es que me urge bastante prisa, tanto como me voy mañana de vacaciones y tengo que sacar esto antes, si no mi jefe me corre a gorrazos :-))

    Tengo tres tablas de las que quiero hacer un select y volcar el contenido a un XML. Si, tan sencillo como eso. Lo estoy intentando con 'FOR XML' y ahora mismo tengo esto.

    SELECT
       a.rdg_center as "dg_property_large/reading_center",
       a.comm_office as "dg_property_large/commercial_office",
       a.prop_id as "dg_property_large/propID",
       a.rdg_sequence as "dg_property_large/reading_sequence",     
       a.no_services as "dg_property_large/services",
       FROM gis_large_propiedad a
       FOR XML PATH('record'), ROOT('PROPERTIES')


    SELECT
       a.rdg_center as "dg_property_small/reading_center",
       a.comm_office as "dg_property_small/commercial_office",
       a.prop_id as "dg_property_small/propID",
       a.rdg_sequence as "dg_property_small/reading_sequence",     
       a.no_services as "dg_property_small/services",
       FROM gis_small_propiedad a
       FOR XML PATH('record'), ROOT('PROPERTIES')

    SELECT
       b.serv_id as "dg_service/serv_id",
       b.account_no as "dg_service/acctno",
       b.ref_no as "dg_service/refno",
       b.kind_use as "dg_service/kind_use",
       b.tarif_code as "dg_service/tariff_code",
       FROM gis_service b
       FOR XML PATH('record'), ROOT('PROPERTIES')



    Esto (como era de esparar por otra parte) me genera tres XML diferentes cuando le necesito solo en uno. He probado algo como.

    SELECT
       a.rdg_center as "dg_property_small/reading_center",
       a.comm_office as "dg_property_small/commercial_office",
       a.prop_id as "dg_property_small/propID",
       a.rdg_sequence as "dg_property_small/reading_sequence",     
       a.no_services as "dg_property_small/services",
       b.serv_id as "dg_service/serv_id",
       b.account_no as "dg_service/acctno",
       b.ref_no as "dg_service/refno",
       b.kind_use as "dg_service/kind_use",
       b.tarif_code as "dg_service/tariff_code"
       FROM gis_small_propiedad a, gis_service b
       FOR XML PATH('record'), ROOT('PROPERTIES')

    Pero con esto se hace un lio. No se muy bien que es lo que intenta hacer pero tengo una tabla con 8.000 registros, la otra con 6.000 y al hacer y lanzar la query trabaja hasta que me deja sin disco duro (10gb) y dice que no puede seguir. Si hago los select por separado los resuelve instantaneamente y los xml ocupan lo normal.

    Seguro que es una chorrada, pero con las prisas no veo nada. Si alguien me puede echar una mano urgentemente se lo agradecería infinitamente.
    Mañana me voy de vacaciones, de ahí mi urgencia :-))

    Muchas gracias a tod@s.

    miércoles, 25 de abril de 2007 8:42

Respuestas

  • Tal y como lo veo, lo que pretendes hacer es factible con  gis_large_propiedad  y gis_small_propiedad, pero gis_service... lo veo como juntar peras con manzanas... ?¿?¿

     

    Si nos centramos en las ods primeras, sería tan sencillo como hacer un UNION del estilo:

     

    Code Snippet

    select *

    from gis_large_propiedad 
    UNION
      select *  from gis_small_propiedad

    FOR XML PATH('record'), ROOT('PROPERTIES')

     


     

    Como lo ves?

     

    Un saludo!

     

    PD: ... y buenas vacaciones!!!!

    miércoles, 25 de abril de 2007 8:57
    Moderador

Todas las respuestas

  • Tal y como lo veo, lo que pretendes hacer es factible con  gis_large_propiedad  y gis_small_propiedad, pero gis_service... lo veo como juntar peras con manzanas... ?¿?¿

     

    Si nos centramos en las ods primeras, sería tan sencillo como hacer un UNION del estilo:

     

    Code Snippet

    select *

    from gis_large_propiedad 
    UNION
      select *  from gis_small_propiedad

    FOR XML PATH('record'), ROOT('PROPERTIES')

     


     

    Como lo ves?

     

    Un saludo!

     

    PD: ... y buenas vacaciones!!!!

    miércoles, 25 de abril de 2007 8:57
    Moderador
  • Si, me había leído la ayuda de UNION pero cono decía que tenia que ser tablas iguales. Pensé eso mismo que dices tu, que peras y manzanas.

    El caso es que el XML que tengo que devolver tiene que llevar las tres tablas.

    No dije antes, que igual sirve de ayuda, que lo que quiero en el XML es primero todas las ocurrencias de una tabla, después todas las de otra y después las de la otra.

    Gracias.
    miércoles, 25 de abril de 2007 9:12
  •  

    Hola,

     

    Os voy a hacer un ejemplo cutre de UNION que te puede servir, y que no tienen porque ser iguales las tablas y ni si quiera tener datos parecidos.

     

    Mira:

     

    SELECT campo1, campo2, '0' as campo3, '0' as campo4, '0' as campo5, '0' as campo6 from tabla1 where .....

     

    UNION ALL

     

    SELECT '0' as campo1, '0' as campo2, campo3, campo4, '0' as campo5, '0' as campo6 from tabla2 where ....

     

    UNION ALL

     

    SELECT '0' as campo1, '0' as campo2, '0' as campo3, '0' as campo4, campo5, campo6 from tabla3 where...

     

    Espero que se me haya entendido...

     

    Un saludo.

    miércoles, 25 de abril de 2007 11:28
    Moderador
  • Esta vez me ha pasado a mí... se me había ocurrido, pero no me había atrevido...

     

    jajajajaa

     

    Un saludete!

    miércoles, 25 de abril de 2007 12:05
    Moderador
  •  

    jajajajjaja

     

    No me extraña... con la que te calló la ultima vez jejeje

     

    Pero alguien se tenia que arriesgar a decirlo... procurar no criticarme mucho jajajaja que ya se que es una solucion muy cutre... pero oye... hay prisas... mejor esto que quedarse sin vacaciones

     

    Un saludo.

    miércoles, 25 de abril de 2007 12:23
    Moderador
  • Perdón por el retraso, no me podido volver a conectar hasta ahora mismo.

    Había llegado a una conclusión similar, pero mas a lo bestia
    Ahora me encuentro con algo de basurilla que no se como quitar. Os cuento a ver si me das alguna idea.

    SELECT
    campo1,
    campo2,
    '' as campo 3,
    '' as campo 4,
    '' as campo 5,
    '' as campo 6
    FROM tabla1

    UNION ALL

    SELECT
    '' as campo1,
    '' as campo2,
      campo 3,
      campo 4,
    '' as campo 5,
    '' as campo 6
    FROM tabla2

    UNION ALL


    SELECT
    '' as campo1,
    '' as campo2,
    '' as campo 3,
    '' as campo 4,
      campo 5,
      campo 6
    FROM tabla1

    FOR XML .......

    Como podeis ver he puesto en los tres select los campos de las tres tablas poniendo en cada select los campos que no son de esa tabla a vacios. Asi no hay problema para usar UNION.

    Esto me devuelve esta estructura:

    <tabla1>datos</tabla1>
    <tabla2></tabla2>
    <tabla3></tabla3>

    <tabla1></tabla1>
    <tabla2>datos</tabla2>
    <tabla3></tabla3>

    <tabla1></tabla1>
    <tabla2></tabla2>
    <tabla3>datos</tabla3>

    Y deberia ser

    <tabla1>datos</tabla1>

    <tabla2>datos</tabla2>

    <tabla3>datos</tabla3>

    Esto es, cuando recibo los datos de la primera tabla, también tengo los tags de las tablas 2 y 3 vacíos. En los datos de la 2 tabla tengo los tags de las tablas 1 y 3 vacíos, etc.... Tengo un montón de tags vacíos que no sirven de nada y ocupan bastante.

    Se os ocurre alguna manera de hacer desaparecer esos tags?

    Muchas gracias por vuestra ayuda. Espero poder dejar cerrado esta mañana por la mañana antes de irme al aeropuerto. Mañana por la noche me tomare unas cervecitas a vuestra salud, que falta me hacen. Ahora mismo estoy currando en Libia y aquí el alcohol, ni olerlo
    miércoles, 25 de abril de 2007 16:28