Blocks.BlockID
だと思います 、Elevations.ElevationID
、Floors.FloorID
、Panels.PanelID
主キーであり、自動生成されたIDENTITY
。
- 1つの
Block
多くのElevations
があります 。 - 1つの
Elevation
多くのFloors
があります 。 - 1つの
Floors
多くのPanels
があります 。
MERGE
を使用します
OUTPUT
を使用 条項。
MERGE
INSERT
できます 、UPDATE
およびDELETE
行。この場合、必要なのはINSERT
だけです。 。
1=0
は常にfalseであるため、NOT MATCHED BY TARGET
一部は常に実行されます。通常、他のブランチが存在する可能性があります。ドキュメントを参照してください。WHEN MATCHED
通常、UPDATE
に使用されます;WHEN NOT MATCHED BY SOURCE
通常、DELETE
に使用されます 、ただし、ここでは必要ありません。
この複雑な形式のMERGE
単純なINSERT
と同等です 、ただし、単純なINSERT
とは異なります そのOUTPUT
句を使用すると、必要な列を参照できます。ソーステーブルと宛先テーブルの両方から列を取得できるため、IDENTITY
によって生成された古い既存のIDと新しいIDの間のマッピングを保存できます。 。
ブロック
指定されたBlock
を1つコピーします IDs
を覚えておいてください 新しいBlock
の 。単純なINSERT
を使用できます およびSCOPE_IDENTITY
ここでは、BlockID
は主キーであり、挿入できる行は1つだけです。
DECLARE @blockToCopy int = 1;
DECLARE @VarNewBlockID int;
INSERT INTO Blocks
(ProjectID
,BlockName
,BlockDescription)
SELECT
ProjectID
,'NewNameTest'
,'NewDescTest'
FROM Blocks
WHERE Blocks.BlockID = @blockToCopy
;
SET @VarNewBlockID = SCOPE_IDENTITY();
標高
Elevations
をコピーします 古いBlock
から それらを新しいBlock
に割り当てます 。古いIDs
間のマッピングを覚えておいてください 新しく生成されたIDs
@MapElevations
で 。
DECLARE @MapElevations TABLE(OldElevationID int, NewElevationID int);
MERGE INTO Elevations
USING
(
SELECT
ElevationID
,@VarNewBlockID AS BlockID
,ElevationName
,ElevationDescription
FROM Elevations
WHERE Elevations.BlockID = @blockToCopy
) AS Src
ON 1 = 0
WHEN NOT MATCHED BY TARGET THEN
INSERT
(BlockID
,ElevationName
,ElevationDescription)
VALUES
(Src.BlockID
,Src.ElevationName
,Src.ElevationDescription)
OUTPUT
Src.ElevationID AS OldElevationID
,inserted.ElevationID AS NewElevationID
INTO @MapElevations(OldElevationID, NewElevationID)
;
フロア
Floors
をコピーします 古いものと新しいものの間のマッピングを使用するElevationID
。古いIDs
間のマッピングを覚えておいてください 新しく生成されたIDs
@MapFloors
で 。
DECLARE @MapFloors TABLE(OldFloorID int, NewFloorID int);
MERGE INTO Floors
USING
(
SELECT
Floors.FloorID
,M.NewElevationID AS ElevationID
,Floors.FloorName
,Floors.FloorDescription
FROM
Floors
INNER JOIN Elevations ON Elevations.ElevationID = Floors.ElevationID
INNER JOIN @MapElevations AS M ON M.OldElevationID = Elevations.ElevationID
WHERE Elevations.BlockID = @blockToCopy
) AS Src
ON 1 = 0
WHEN NOT MATCHED BY TARGET THEN
INSERT
(ElevationID
,FloorName
,FloorDescription)
VALUES
(Src.ElevationID
,Src.FloorName
,Src.FloorDescription)
OUTPUT
Src.FloorID AS OldFloorID
,inserted.FloorID AS NewFloorID
INTO @MapFloors(OldFloorID, NewFloorID)
;
パネル
Panels
をコピーします 古いものと新しいものの間のマッピングを使用するFloorID
。これは詳細の最後のレベルであるため、単純なINSERT
を使用できます。 IDs
のマッピングを忘れないでください 。
INSERT INTO Panels
(FloorID
,PanelName
,PanelDescription)
SELECT
M.NewFloorID
,Panels.PanelName
,Panels.PanelDescription
FROM
Panels
INNER JOIN Floors ON Floors.FloorID = Panels.FloorID
INNER JOIN Elevations ON Elevations.ElevationID = Floors.ElevationID
INNER JOIN @MapFloors AS M ON M.OldFloorID = Floors.FloorID
WHERE Elevations.BlockID = @blockToCopy
;