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

Mssql में बहु स्तरीय संबंधित तालिकाओं की प्रतिलिपि बनाना

अगर आपके PK IDENTITY हैं कॉलम, आप MERGE . वाली तकनीक का उपयोग कर सकते हैं जिसका वर्णन यह प्रश्न

यहां बताया गया है कि पूरी प्रक्रिया को कैसे स्क्रिप्ट किया जा सकता है:

DECLARE @OldID int, @NewID int;
SET @OldID = some_value;

DECLARE @TwoMapping TABLE (OldID int, NewID int);
DECLARE @ThreeMapping TABLE (OldID int, NewID int);

INSERT INTO One
SELECT columns
FROM One
WHERE OneID = @OldID;
SET @NewID = SCOPE_IDENTITY();
/*
That one was simple: one row is copied, so just reading SCOPE_IDENTITY()
after the INSERT. The actual mapping technique starts at this point.
*/

MERGE Two tgt
USING (
  SELECT
    @NewID AS OneID,
    other columns
  FROM Two t
  WHERE OneID = @OldID
) src
ON 0 = 1
WHEN NOT MATCHED THEN
  INSERT (columns) VALUES (src.columns)
OUTPUT src.TwoID, INSERTED.TwoID INTO @TwoMapping (OldID, NewID);
/*
As you can see, MERGE allows us to reference the source table in the
OUTPUT clause, in addition to the pseudo-tables INSERTED and DELETED,
and that is a great advantage over INSERT and the core of the method.
*/

MERGE Three tgt
USING (
  SELECT
    map.NewID AS TwoID,
    t.other columns
  FROM Three t
    INNER JOIN @TwoMapping map ON t.TwoID = map.OldID
) src
ON 0 = 1
WHEN NOT MATCHED THEN
  INSERT (columns) VALUES (src.columns)
OUTPUT src.ThreeID, INSERTED.ThreeID INTO @ThreeMapping (OldID, NewID);
/*
Now that we've got a mapping table, we can easily substitute new FKs for the old
ones with a simple join. The same is repeated once again in the following MERGE.
*/

MERGE Four tgt
USING (
  SELECT
    map.NewID AS ThreeID,
    t.columns
  FROM Four t
    INNER JOIN @ThreeMapping map ON t.ThreeID = map.OldID
) src
ON 0 = 1
WHEN NOT MATCHED THEN
  INSERT (columns) VALUES (src.columns);
/*
The Four table is the last one in the chain of dependencies, so the last MERGE
has no OUTPUT clause. But if there were a Five table, we would go on like above.
*/

वैकल्पिक रूप से आपको शायद कर्सर का उपयोग करना होगा, जो SQL सर्वर 2005 और पुराने संस्करणों में ऐसा करने का एकमात्र (समझदार) तरीका प्रतीत होता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. कई कॉलम से न्यूनतम मान चुनने का सबसे अच्छा तरीका क्या है?

  2. तालिका डेटा का XML उत्पन्न करने के लिए SQL

  3. क्या हमारे पास एक विदेशी कुंजी हो सकती है जो किसी अन्य तालिका में प्राथमिक कुंजी नहीं है?

  4. SQL 2008:पूर्ण पाठ खोज क्वेरी के लिए शब्दों को रोकें बंद करें

  5. माइक्रोसॉफ्ट एसक्यूएल सर्वर 2008 में एक क्वेरी चलाने से पहले कैसे पता चलेगा कि कितनी पंक्तियां प्रभावित होंगी?