Pergunta

Este surge na sequência desta pergunta:
Modificar XML no servidor SQL para adicionar um nó raiz

Além do problema colocado e agora fixada nessa questão, eu também estou dividindo a tabela existente em 2, onde a segunda tabela é uma sub-tabela da primeira, com uma volta de chave estrangeira para o primeiro.

Assim, atualmente

table1(ID, col1, col2, col3....coln)

Está se tornando

table1(ID, col1, col2, col3)

e

table2(PK, FK_table1, col4, col5, ...coln)

No momento eu não ter retirado qualquer coisa, desde a tabela existente, acaba de criar o segundo, e eu descobri o OUTPUT construção para que eu possa inserir em ambas as tabelas de uma vez, inclusive colocando o PK da 1ª tabela no 2º como FK no 1 insert - assim algo 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)

isso com sucesso inserções em ambas as tabelas de uma só vez MAS se baseia no fato eu não ter removido as colunas da tabela 1, no entanto, ** e * resulta em uma relação 1: 1 entre as tabelas, quando o que eu preciso é para table1 apenas para ter linhas para col1 distinta, col2, col3, com segurando a informação mais detalhada table2

Eu estou querendo saber se eu estou lidando com isso da maneira certa? Será que vou ser capaz de fazer isso em uma consulta ou eu vou ter que dividi-la? Estou pensando que talvez eu poderia rasgar o XML primeiro em table1, em seguida, rasgar novamente separadamente em table2, juntando-se na tabela 1 para obter o FK para a inserção? Alguém já fez esse tipo de coisa antes?

Foi útil?

Solução

Sim, eu sou feito semelhante e usou as duas sugestões dependendo do que outro trabalho que eu preciso fazer

Opções:

  1. Fragmento o XML uma vez em uma variável tabe SELECIONE distinto daquele em table1, SELECT em table2

  2. Fragmento o XML duas vezes.

Eu estaria inclinado a fazer a operação caro (XML retalhamento), primeiro de uma só vez.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top