मुझे लगता है कि 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
;