Se isso é algo que você planeja fazer regularmente (isto é, faz parte da lógica do aplicativo e não um exercício único de transformação de dados), você pode usar uma visualização na Tabela1 e na Tabela2 com um INSTEAD OF INSERT
gatilho para gerenciar a divisão dos dados (e organizar as chaves / relacionamentos) - então você faria:
INSERT newView SELECT NEWID(), A, B, C, D, E, F FROM MyTable
e o gatilho pode ser tão simples quanto:
CREATE trg_newview_insert TRIGGER newView INSTEAD OF UPDATE AS
INSERT table1 SELECT ID, A, B, C FROM inserted
INSERT table2 SELECT ID, D, E, F FROM inserted
GO
assumindo que a visualização é algo como:
CREATE VIEW newView AS
SELECT table1.ID, A, B, C, D, E, F
FROM table1
JOIN table2 ON table1.ID = table2.ID;
ou se houver linhas em cada tabela sem as linhas correspondentes na outra:
CREATE VIEW newView AS
SELECT ISNULL(table1.ID, table2.ID), A, B, C, D, E, F
FROM table1
FULL OUTER JOIN table2 ON table1.ID = table2.ID;
(é claro que linhas são exibidas quando você, SELECT
na visualização, não é importante se você não pretende SELECT
e só existe para fornecer um modelo INSERT
para o gatilho fazer sua mágica)
Isso pressupõe que você pretenda usar um tipo de UUID para sua chave primária nesse caso - se você estiver usando uma chave inteira de incremento automático na tabela1, há um pouco mais de trabalho a fazer. Algo como o seguinte pode funcionar:
CREATE trg_newview_insert TRIGGER newView INSTEAD OF UPDATE AS
INSERT table1 (A, B, C)
SELECT A, B, C
FROM inserted;
INSERT table2 (ID, D, E, F)
SELECT ID, D, E, F
FROM table1 AS t
JOIN inserted AS i ON t.A = i.A AND t.B = i.B AND t.C = i.C;
GO
e, de fato, esse par de INSERT
instruções pode funcionar diretamente como um caso único (se você está usando um INT IDENTITY
ou UNIQUEIDENTIFIER DEFAULT NEWID()
tipo para a chave):
INSERT table1 (A, B, C)
SELECT A, B, C
FROM MyTable;
INSERT table2 (ID, D, E, F)
SELECT ID, D, E, F
FROM table1 AS t
JOIN MyTable AS i ON t.A = i.A AND t.B = i.B AND t.C = i.C;
negando a necessidade da visão e acionar completamente, embora, se esta for uma operação que você esteja realizando com frequência em seu código, o mecanismo de visão + ainda valha a pena considerar para abstrair a necessidade de várias instruções a cada vez.
CAVEAT: todo o SQL acima foi digitado por pensamento e não foi testado; ele precisará de trabalho antes que haja qualquer garantia de que ele funcionará conforme necessário.
Ao ler sua pergunta e os comentários das outras respostas, parece que você está tentando resolver um problema
DataTable
, dividindo-o em duas novas tabelas.Suponho que
DataTable
ainda não tenha um único campo único, como umIDENTITY(1,1)
? Caso contrário, talvez você deva adicionar um que possa ser usado para inserir dados noTable1
eTable2
.A título de exemplo; Criei um esquema de amostra, inseri dados de teste
DataTable
, modifiqueiDataTable
para ter umaIDENTITY(1,1)
coluna e usei isso para inserir dados em ambosTable1
eTable2
:fonte
Isso funcionou para mim, eu sei que é uma resposta muito tardia, mas pode ajudar os outros. Eu costumava
IDENT_CURRENT
obter a identidade da linha da inserção anterior, mas para mim é sempre uma linha.fonte