Meu banco de dados contém três tabelas chamadas Object_Table
, Data_Table
e Link_Table
. A tabela de links contém apenas duas colunas, a identidade de um registro de objeto e a identidade de um registro de dados.
Quero copiar os dados de DATA_TABLE
onde eles estão vinculados a uma determinada identidade de objeto e inserir registros correspondentes em Data_Table
e Link_Table
para uma identidade de objeto diferente.
Eu posso fazer isso selecionando em uma variável de tabela e fazendo o loop fazendo duas inserções para cada iteração.
Esse é o melhor jeito de fazer isso?
Edit : Eu quero evitar um loop por dois motivos, o primeiro é que eu sou preguiçoso e uma tabela loop / temp requer mais código, mais código significa mais lugares para cometer um erro e o segundo motivo é uma preocupação com o desempenho.
Posso copiar todos os dados em uma inserção, mas como fazer com que a tabela de links se vincule aos novos registros de dados em que cada registro possui um novo ID?
fonte
Respostas:
Em uma declaração : Não.
Em uma transação : Sim
A boa notícia é que o código acima também é garantido como atômico e pode ser enviado ao servidor a partir de um aplicativo cliente com uma string sql em uma única chamada de função, como se fosse uma declaração. Você também pode aplicar um gatilho a uma tabela para obter o efeito de uma única inserção. No entanto, em última análise, ainda existem duas instruções e você provavelmente não deseja executar o gatilho para cada inserção.
fonte
insert into ... select ...
declaração. Como o código acima lê ou faz um loop nos dados de Object_Table. Você ainda precisará usar uma variável de tabela que o solicitante não quis fazer.Você ainda precisa de duas
INSERT
instruções, mas parece que deseja obter aIDENTITY
primeira inserção e usá-la na segunda; nesse caso, convém procurarOUTPUT
ouOUTPUT INTO
: http://msdn.microsoft.com/en- pt-br / library / ms177564.aspxfonte
O seguinte configura a situação que tive, usando variáveis de tabela.
Graças a outra resposta que me indicou a cláusula OUTPUT, posso demonstrar uma solução:
Acontece, no entanto, que não é tão simples na vida real devido ao seguinte erro
Ainda posso usar
OUTPUT INTO
uma tabela temporária e terminar com a inserção normal. Portanto, posso evitar meu loop, mas não posso evitar a tabela temporária.fonte
Parece que a tabela Link captura o relacionamento many: many entre a tabela Object e a tabela Data.
Minha sugestão é usar um procedimento armazenado para gerenciar as transações. Quando você deseja inserir na tabela Objeto ou Dados, faça suas inserções, obtenha os novos IDs e insira-os na tabela Link.
Isso permite que toda a sua lógica permaneça encapsulada em um sproc fácil de chamar.
fonte
Se você deseja que as ações sejam mais ou menos atômicas, certifique-se de envolvê-las em uma transação. Dessa forma, você pode ter certeza de que ambos aconteceram ou não, conforme necessário.
fonte
Você pode criar uma Visualização selecionando os nomes das colunas exigidas por sua instrução de inserção, adicionar um acionador INSTEAD OF INSERT e inserir nessa visualização.
fonte
Eu quero enfatizar o uso
para a transação MSSQL com várias instruções sql.
Consulte: https://msdn.microsoft.com/en-us/library/ms188792.aspx Eles fornecem um exemplo muito bom.
Portanto, o código final deve se parecer com o seguinte:
fonte
O Insert só pode operar em uma mesa por vez. Múltiplas inserções precisam ter várias instruções.
Não sei se você precisa fazer o loop através de uma variável de tabela - você não pode simplesmente usar uma inserção em massa em uma tabela e depois a inserção em massa na outra?
A propósito - acho que você quer dizer copiar os dados de Object_Table; caso contrário, a questão não faz sentido.
fonte
Antes de poder fazer uma inserção multititável no Oracle, você poderia usar um truque envolvendo uma inserção em uma exibição que tivesse um gatilho INSTEAD OF definido para executar as inserções. Isso pode ser feito no SQL Server?
fonte
fonte
// se você deseja inserir o mesmo que a primeira tabela
// ou se você deseja inserir certas partes da tabela um
// sei que parece bom demais para estar certo, mas funciona e você pode continuar adicionando consultas, basta alterar o
Eu tenho 17 tabelas em que isso funcionou.
fonte