Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

कैस्केड सभी बाल पंक्तियों और उनकी बाल पंक्तियों आदि के साथ एक पंक्ति की प्रतिलिपि बनाएँ

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में PARSE() बनाम TRY_PARSE():क्या अंतर है?

  2. SQL सर्वर (T-SQL) में किसी प्रोफ़ाइल से डेटाबेस मेल खाता कैसे निकालें

  3. जावा से एसक्यूएल सर्वर संग्रहीत प्रक्रिया में टेबल-मूल्यवान पैरामीटर कैसे पास करें?

  4. मैं SQL सर्वर में मनी डेटाटाइप से कैसे परिवर्तित करूं?

  5. SQL सर्वर कर्सर के लिए चरणों को परिभाषित करें - SQL सर्वर / TSQL ट्यूटोरियल