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

मास्टर-विवरण संबंध के साथ कई रिकॉर्ड कॉपी करें

यहां वर्णित समाधान बहु-उपयोगकर्ता वातावरण में सही ढंग से काम करेगा।

मैं 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 द्वारा उत्पन्न पुरानी मौजूदा आईडी और नई आईडी के बीच मैपिंग को सहेजता है। ।

नमूना डेटा

INSERT INTO [dbo].[StageDetail]
    ([StageNUmber]
    ,[TypeOfStage]
    ,[Distance])
VALUES
    ('sn01','t1','D1'),
    ('sn02','t2','D2'),
    ('sn03','t3','D3');

INSERT INTO [dbo].[StageDetailItem]
    ([StageDetailID]
    ,[Road]
    ,[CostPer])
VALUES
    (1,'r1_1','C11'),
    (1,'r1_2','C12'),
    (1,'r1_3','C13'),
    (1,'r1_4','C14'),
    (1,'r1_5','C15'),

    (2,'r2_1','C16'),
    (2,'r2_2','C17'),
    (2,'r2_3','C18'),
    (2,'r2_4','C19'),
    (2,'r2_5','C20'),

    (3,'r3_1','C21'),
    (3,'r3_2','C22'),
    (3,'r3_3','C23'),
    (3,'r3_4','C24'),
    (3,'r3_5','C25');

क्वेरी

पुरानी और नई आईडी के बीच मैपिंग को होल्ड करने के लिए टेबल वैरिएबल (या टेम्प टेबल) घोषित करें।

DECLARE @T TABLE(OldStageDetailID int, NewStageDetailID int);

सबसे पहले StageDetail . से पंक्तियों की एक कॉपी बनाएं तालिका चर में आईडी के मानचित्रण को याद रखने वाली तालिका।

MERGE INTO [dbo].[StageDetail]
USING
(
    SELECT [StageDetailID],[StageNUmber],[TypeOfStage],[Distance]
    FROM [dbo].[StageDetail]
) AS Src
ON 1 = 0
WHEN NOT MATCHED BY TARGET THEN
INSERT ([StageNUmber],[TypeOfStage],[Distance])
VALUES
    (Src.[StageNUmber]
    ,Src.[TypeOfStage]
    ,Src.[Distance])
OUTPUT 
    Src.[StageDetailID] AS OldStageDetailID
    ,inserted.[StageDetailID] AS NewStageDetailID
INTO @T(OldStageDetailID, NewStageDetailID)
;

फिर StageDetailItem . से पंक्तियों को कॉपी करें नए StageDetailIDs . का उपयोग करना ।

INSERT INTO [dbo].[StageDetailItem]
    ([StageDetailID]
    ,[Road]
    ,[CostPer])
SELECT
    T.[NewStageDetailID]
    ,[dbo].[StageDetailItem].[Road]
    ,[dbo].[StageDetailItem].[CostPer]
FROM
    [dbo].[StageDetailItem]
    INNER JOIN @T AS T ON T.OldStageDetailID = [dbo].[StageDetailItem].StageDetailID
;

परिणाम

SELECT * FROM [dbo].[StageDetail]

+---------------+-------------+-------------+----------+
| StageDetailID | StageNUmber | TypeOfStage | Distance |
+---------------+-------------+-------------+----------+
|             1 | sn01        | t1          | D1       |
|             2 | sn02        | t2          | D2       |
|             3 | sn03        | t3          | D3       |
|             4 | sn01        | t1          | D1       |
|             5 | sn02        | t2          | D2       |
|             6 | sn03        | t3          | D3       |
+---------------+-------------+-------------+----------+

SELECT * FROM [dbo].[StageDetailItem]

+-------------------+---------------+------+---------+
| StageDetailItemID | StageDetailID | Road | CostPer |
+-------------------+---------------+------+---------+
|                 1 |             1 | r1_1 | C11     |
|                 2 |             1 | r1_2 | C12     |
|                 3 |             1 | r1_3 | C13     |
|                 4 |             1 | r1_4 | C14     |
|                 5 |             1 | r1_5 | C15     |
|                 6 |             2 | r2_1 | C16     |
|                 7 |             2 | r2_2 | C17     |
|                 8 |             2 | r2_3 | C18     |
|                 9 |             2 | r2_4 | C19     |
|                10 |             2 | r2_5 | C20     |
|                11 |             3 | r3_1 | C21     |
|                12 |             3 | r3_2 | C22     |
|                13 |             3 | r3_3 | C23     |
|                14 |             3 | r3_4 | C24     |
|                15 |             3 | r3_5 | C25     |
|                16 |             4 | r1_1 | C11     |
|                17 |             4 | r1_2 | C12     |
|                18 |             4 | r1_3 | C13     |
|                19 |             4 | r1_4 | C14     |
|                20 |             4 | r1_5 | C15     |
|                21 |             5 | r2_1 | C16     |
|                22 |             5 | r2_2 | C17     |
|                23 |             5 | r2_3 | C18     |
|                24 |             5 | r2_4 | C19     |
|                25 |             5 | r2_5 | C20     |
|                26 |             6 | r3_1 | C21     |
|                27 |             6 | r3_2 | C22     |
|                28 |             6 | r3_3 | C23     |
|                29 |             6 | r3_4 | C24     |
|                30 |             6 | r3_5 | C25     |
+-------------------+---------------+------+---------+



  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 Server 2000 का उपयोग करके पिवट करें

  2. SQL में डायनामिक रूप से/प्रोग्रामेटिक रूप से WHERE क्लॉज़ जोड़ें

  3. एक कंप्यूटेड कॉलम बनाएं जो SQL सर्वर में किसी अन्य तालिका से डेटा का उपयोग करता है

  4. SQL सर्वर डेटाबेस में सिस्टम तालिकाओं की संख्या की गणना करने के 3 तरीके

  5. SYSDATETIME () SQL सर्वर में उदाहरण (T-SQL)