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?

È stato utile?

Soluzione

Sì, ho fatto qualcosa di simile e ho usato entrambi i suggerimenti a seconda dell'altro lavoro che devo fare

Opzioni:

  1. Distrugge l'XML una volta in una variabile tabe SELEZIONA DISTINCT da quello nella tabella1, SELEZIONA nella tabella2

  2. Distruggi due volte l'XML.

Sarei propenso a fare l'operazione costosa (distruggere XML) prima in una volta sola.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top