मुझे लगता है कि Blocks.BlockID
, Elevations.ElevationID
, Floors.FloorID
, Panels.PanelID
प्राथमिक कुंजी हैं और स्वत:उत्पन्न IDENTITY
. हैं ।
- एक
Block
कईElevations
है । - एक
Elevations
कईFloors
है । - एक
Floor
कईPanels
है ।
मैं MERGE
का उपयोग करूंगा
OUTPUT
के साथ खंड।
MERGE
कर सकते हैं INSERT
, UPDATE
और DELETE
पंक्तियाँ। इस मामले में हमें केवल INSERT
. की आवश्यकता है .
1=0
हमेशा असत्य होता है, इसलिए NOT MATCHED BY TARGET
भाग हमेशा निष्पादित होता है। सामान्य तौर पर, अन्य शाखाएं हो सकती हैं, दस्तावेज़ देखें।WHEN MATCHED
आमतौर पर UPDATE
. के लिए उपयोग किया जाता है;WHEN NOT MATCHED BY SOURCE
आमतौर पर DELETE
. के लिए उपयोग किया जाता है , लेकिन हमें यहां उनकी आवश्यकता नहीं है।
MERGE
. का यह जटिल रूप सरल INSERT
. के बराबर है , लेकिन साधारण INSERT
. के विपरीत इसका OUTPUT
खंड उन स्तंभों को संदर्भित करने की अनुमति देता है जिनकी हमें आवश्यकता है। यह स्रोत और गंतव्य तालिका दोनों से स्तंभों को पुनः प्राप्त करने की अनुमति देता है, इस प्रकार IDENTITY
द्वारा उत्पन्न पुरानी मौजूदा आईडी और नई आईडी के बीच मैपिंग को सहेजता है। ।
अवरुद्ध करें
दिए गए एक को कॉपी करें Block
और ID
याद रखें नए Block
. का .हम सरल INSERT
. का उपयोग कर सकते हैं और SCOPE_IDENTITY
यहाँ, क्योंकि BlockID
प्राथमिक कुंजी है और केवल एक पंक्ति डाली जा सकती है।
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
;