Si vous prévoyez de le faire régulièrement (c'est-à-dire qu'il fait partie de la logique d'application et non d'un exercice de transformation de données ponctuel), vous pouvez utiliser une vue sur Table1 et Table2 avec un INSTEAD OF INSERT
déclencheur pour gérer le fractionnement des données (et l'organisation les clés / relations) - alors vous feriez simplement:
INSERT newView SELECT NEWID(), A, B, C, D, E, F FROM MyTable
et le déclencheur pourrait être aussi simple que:
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
en supposant que la vue est quelque chose comme:
CREATE VIEW newView AS
SELECT table1.ID, A, B, C, D, E, F
FROM table1
JOIN table2 ON table1.ID = table2.ID;
ou s'il peut y avoir des lignes dans chaque table sans lignes correspondantes dans l'autre:
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;
(bien sûr, quelles lignes sont sorties lorsque vous SELECT
de la vue n'a pas d'importance si vous n'en avez pas l'intention SELECT
et qu'il n'existe que pour fournir un modèle INSERT
dans lequel le déclencheur fera sa magie)
Cela suppose que vous avez l'intention d'utiliser un type UUID pour votre clé primaire dans ce cas - si vous utilisez une clé entière incrémentée automatiquement sur table1, il y a un peu plus de travail à faire. Quelque chose comme ce qui suit pourrait fonctionner:
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
et en fait, cette paire d' INSERT
instructions peut fonctionner directement comme une seule comme ceci (que vous utilisiez un INT IDENTITY
ou un UNIQUEIDENTIFIER DEFAULT NEWID()
type pour la clé):
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;
annulant complètement le besoin de la vue et du déclencheur, bien que s'il s'agit d'une opération que vous effectuerez souvent dans votre code, le déclencheur vue + devrait encore être envisagé de faire abstraction du besoin de plusieurs instructions à chaque fois.
CAVEAT: tout le SQL ci-dessus a été tapé de la pensée et non testé, il aura besoin de travail avant qu'il n'y ait une garantie qu'il fonctionnera comme vous en avez besoin.