Raggruppare i dati durante la distruzione di XML in più tabelle nel server SQL
-
06-07-2019 - |
Domanda
Questo fa seguito a questa domanda:
Modifica XML in SQL server per aggiungere un nodo radice
Oltre al problema posto e ora risolto in quella domanda, sto anche dividendo la tabella esistente in 2, dove la seconda tabella è una sotto-tabella della prima, con una chiave esterna di nuovo alla prima.
Quindi attualmente
table1(ID, col1, col2, col3....coln)
Sta diventando
table1(ID, col1, col2, col3)
e
table2(PK, FK_table1, col4, col5, ...coln)
Al momento non ho rimosso nulla dalla tabella esistente, ho appena creato la seconda e ho scoperto il costrutto OUTPUT in modo da poterlo inserire in entrambe le tabelle contemporaneamente, incluso l'inserimento PK della prima tabella nella seconda come FK nell'inserto 1 - quindi qualcosa di simile;
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)
Questo si inserisce correttamente in entrambe le tabelle contemporaneamente MA si basa sul fatto che non ho ancora rimosso le colonne da table1, ** AND * risulta in una relazione 1: 1 tra le tabelle, quando quello di cui ho bisogno è che table1 abbia solo righe per distinti col1, col2, col3, con table2 che contenga le informazioni più dettagliate
Mi chiedo se sto andando nel modo giusto? Potrò farlo in 1 query o dovrò romperlo? Sto pensando che forse potrei distruggere prima l'xml in table1, quindi di nuovo separatamente in table2, unendomi a table1 per ottenere l'FK per l'inserimento? Qualcuno ha fatto questo genere di cose prima?
Soluzione
Sì, ho fatto qualcosa di simile e ho usato entrambi i suggerimenti a seconda dell'altro lavoro che devo fare
Opzioni:
-
Distrugge l'XML una volta in una variabile tabe SELEZIONA DISTINCT da quello nella tabella1, SELEZIONA nella tabella2
-
Distruggi due volte l'XML.
Sarei propenso a fare l'operazione costosa (distruggere XML) prima in una volta sola.