Agrupe los datos al destruir xml en varias tablas en el servidor SQL
-
06-07-2019 - |
Pregunta
Esto se deduce de esta pregunta:
Modifique XML en el servidor SQL para agregar un nodo raíz
Además del problema planteado y ahora resuelto en esa pregunta, también estoy dividiendo la tabla existente en 2, donde la segunda tabla es una sub-tabla de la primera, con una clave externa de nuevo a la primera.
Así que actualmente
table1(ID, col1, col2, col3....coln)
Se está convirtiendo
table1(ID, col1, col2, col3)
y
table2(PK, FK_table1, col4, col5, ...coln)
En este momento no he eliminado nada de la tabla existente, solo creé la segunda, y descubrí la construcción SALIDA para poder insertarla en ambas tablas a la vez, incluida la colocación de PK de la 1ª tabla en la 2ª como FK en la inserción 1, así que algo así como:
INSERT INTO table1 col1, col2,...etc...
OUTPUT inserted.ID, col1, col2, ....
INTO table2(FK_table1, col1, col2, .... )
Select col.value('node1[1]', 'int') col1,
col.value('node2[1]', 'varchar(50)') col2,
....etc......
FROM @xml.nodes('//Items/Item') doc(col)
Esto se inserta con éxito en ambas tablas a la vez PERO se basa en el hecho de que todavía no he eliminado las columnas de la tabla1, ** AND * produce una relación de 1: 1 entre las tablas, cuando lo que necesito es que table1 tenga filas para col1, col2, col3, con table2 con la información más detallada
Me pregunto si voy a hacer esto de la manera correcta. ¿Podré hacer esto en una consulta o tendré que dividirlo? Estoy pensando que tal vez podría destruir el xml primero en la tabla 1, y luego volver a triturar por separado en la tabla 2, uniéndome en la tabla 1 para obtener el FK para la inserción. ¿Alguien ha hecho este tipo de cosas antes?
Solución
Sí, he terminado de manera similar y he usado ambas sugerencias según el trabajo que necesito hacer
Opciones:
-
Triture el XML una vez en una variable tabe SELECCIONE DISTINTO de eso en tabla1, SELECCIONE en tabla2
-
Triture el XML dos veces.
Me inclinaría por hacer la operación costosa (trituración de XML) primero de una vez.