Si esto es algo que planea hacer regularmente (es decir, es parte de la lógica de la aplicación y no un ejercicio de transformación de datos único), entonces podría usar una vista en Tabla1 y Tabla2 con un INSTEAD OF INSERT
disparador para administrar la división de los datos (y organizar las claves / relaciones), entonces simplemente harías:
INSERT newView SELECT NEWID(), A, B, C, D, E, F FROM MyTable
y el desencadenante podría ser tan simple como:
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
asumiendo que la vista es algo como:
CREATE VIEW newView AS
SELECT table1.ID, A, B, C, D, E, F
FROM table1
JOIN table2 ON table1.ID = table2.ID;
o si puede haber filas en cada tabla sin filas coincidentes en la otra:
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;
(por supuesto, qué filas se generan cuando usted SELECT
desde la vista no es importante si no tiene la intención SELECT
de hacerlo y solo existe para proporcionar una plantilla INSERT
para que el disparador haga su magia)
Esto supone que tiene la intención de utilizar un tipo de UUID para su clave principal en este caso; si está utilizando una clave entera que se incrementa automáticamente en la tabla 1, hay un poco más de trabajo por hacer. Algo como lo siguiente podría 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
y, de hecho, ese par de INSERT
declaraciones podría funcionar directamente de manera única (ya sea que esté usando un INT IDENTITY
o UNIQUEIDENTIFIER DEFAULT NEWID()
escriba la clave):
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 la necesidad de la vista y el disparador por completo, aunque si esta es una operación que realizará a menudo en su código, vale la pena considerar la vista + disparador para resumir la necesidad de múltiples declaraciones cada vez.
PRECAUCIÓN: todo el SQL anterior se ha escrito de forma pensada y no se ha probado, necesitará trabajo antes de que haya alguna garantía de que funcionará según lo necesite.
Al leer su pregunta y los comentarios sobre las otras respuestas, parece que está intentando solucionar un problema
DataTable
dividiéndolo en dos tablas nuevas.Supongo que
DataTable
todavía no tiene un único campo único como unIDENTITY(1,1)
? De lo contrario, quizás debería agregar uno que podría usar para insertar datos enTable1
yTable2
.A modo de ejemplo; Creé un esquema de muestra, inserté datos de prueba
DataTable
, modifiquéDataTable
para tener unaIDENTITY(1,1)
columna, luego los usé para insertar datos en ambosTable1
yTable2
:fuente
Esto funcionó para mí, sé que es una respuesta muy tardía, pero puede ayudar a otros. Solía
IDENT_CURRENT
obtener la identidad de la fila de la inserción anterior, pero para mí siempre es una fila.fuente