이것이 정기적으로 수행하려는 계획 인 경우 (즉, 일회성 데이터 변환 연습이 아닌 응용 프로그램 논리의 일부 임) INSTEAD OF INSERT
데이터 분할 관리 및 트리거 와 함께 Table1 및 Table2에 대한 뷰를 사용할 수 있습니다. 키 / 관계))-다음과 같이하십시오.
INSERT newView SELECT NEWID(), A, B, C, D, E, F FROM MyTable
트리거는 다음과 같이 간단 할 수 있습니다.
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
뷰를 가정하면 다음과 같습니다.
CREATE VIEW newView AS
SELECT table1.ID, A, B, C, D, E, F
FROM table1
JOIN table2 ON table1.ID = table2.ID;
또는 다른 테이블의 행과 일치하지 않는 각 테이블에 행이있을 수있는 경우 :
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;
(물론 SELECT
보기를 원하지 않을 때 어떤 행이 출력되는지 는 중요하지 않으며 트리거가 마법을 수행하기 위해 SELECT
템플릿을 제공하기 만하면됩니다 INSERT
)
이것은이 경우 기본 키에 UUID 유형을 사용하려고한다고 가정합니다. table1에서 자동으로 증가하는 정수 키를 사용하는 경우 조금 더해야 할 일이 있습니다. 다음과 같은 것이 작동 할 수 있습니다.
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
실제로 한 쌍의 INSERT
명령문은 일회성으로 직접 작동 할 수 있습니다 ( 키에 대해 INT IDENTITY
또는 UNIQUEIDENTIFIER DEFAULT NEWID()
유형을 사용하는지 여부 ).
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;
뷰의 필요성을 없애고 완전히 트리거하지만, 이것이 작업 인 경우 코드에서 종종 수행 할 때마다 뷰 + 트리거는 매번 여러 명령문의 필요성을 추상화하는 것을 고려할 가치가 있습니다.
주의 사항 : 위의 모든 SQL은 생각에서 입력되었으며 테스트되지 않았으므로 필요에 따라 작동한다는 보장이 있기 전에 작업이 필요합니다.