2012-04-03 15 views
2

Ich bin neue gespeicherte Prozeduren und versuche, eine Prozedur zu schreiben, um Benutzerstammdaten (Benutzer_id) in neue Benutzerdaten zu duplizieren. Hier ist meine Tabellenstruktur. Ich werde ein Ziel user_id und Ziel user_id an die gespeicherte Prozedur übergeben. Können Sie mir bitte mitteilen, wie Sie diese Funktionalität erreichen können? Ich schätze jede Hilfe.Gespeicherte Prozedur zum Duplizieren von Master-Detaildaten

TABLE A 
---------------- 
a_id  int(Primary Key) 
desc  varchar(50) 
user_id int 

TABLE B 
----------------- 
b_id  int(Primary Key) 
a_id  int(Foreign Key) 
detail  varchar(100) 

CREATE PROCEDURE [duplicate_user_data] 
    @old_user_id int, 
    @new_user_id int 
AS 
BEGIN 
    INSERT INTO TABLEA 
      ([desc] 
      ,[user_id] 
      ) 
    select desc, user_id from TABLEA where user_id = @old_user_id 
END 
+0

Hier ist was ich habe. – nav100

+0

Erfassen Sie nach der Einfügung scope_identity() in eine lokale Variable und fügen Sie dann eine Auswahl der TabelleB mit der lokalen Variablen in der Spalte a_id ein. –

+0

Wie bekomme ich scope_identity() für mehrere Datensätze von TABLEA? – nav100

Antwort

1

Sie ein verwenden können selbst verbinden den alten entsprechen und neue Eltern-IDs

CREATE PROCEDURE [duplicate_user_data] 
    @old_user_id int, 
    @new_user_id int 
AS 
    INSERT INTO TableA ([desc], [user_id]) 
    SELECT [desc], @new_user_id 
    FROM TableA 
    WHERE [user_id] = @old_user_id 

    INSERT INTO TableB ([a_id], [detail]) 
    SELECT NewTableA.[a_id], TableB.[detail] 
    FROM TableA AS NewTableA 
    CROSS JOIN TableA AS OldTableA 
    JOIN TableB ON TableB.[a_id] = OldTableA.[a_id] 
    WHERE NewTableA.[user_id] = @new_user_id 
    AND OldTableA.[user_id] = @old_user_id 
+0

Es gibt 13 Datensätze in meiner TABELLE B Tabelle. Aber ich bekomme 37752 Zeilen mit der CROSS JOIN Abfrage. – nav100

+0

Wow, das ist unerwartet. Enthält Ihre WHERE-Klausel wirklich beide user_id-Variablen? Außerdem geht meine Antwort davon aus, dass es eine UNIQUE-Einschränkung für [user_id] für TableA gibt. Ist das korrekt? –

+0

Ja, user_id ist eindeutig. Jetzt habe ich beide user_id Variablen verwendet, aber es gibt diesmal 66 Datensätze zurück. – nav100

0

wenn ich Sie richtig bin zu verstehen, wollen Sie einen neuen Datensatz für den neuen Benutzer einzufügen, aber die Details von einem anderen Benutzer kopieren. Wenn ja, dann können Sie etwas tun:

CREATE PROCEDURE [duplicate_user_data] 
    @old_user_id int, 
    @new_user_id int 
AS 
BEGIN 
    declare @old_a_id int 

    -- get the old a_id first 
    SELECT @old_a_id = a_id 
    FROM TableA 
    WHERE [user_id] = @old_user_id 

    -- insert the new record into TableA 
    INSERT INTO TABLEA 
    (
     [desc] 
     ,[user_id] 
    ) 
    select [desc] 
     , @new_user_id 
    from TABLEA 
    where [user_id] = @old_user_id 

    -- insert new record into tableB using the @old_a_id 
    INSERT INTO TableB 
    (
     a_id 
     , detail 
    ) 
    SELECT @old_a_id 
     , detail 
    FROM TableB 
    WHERE a_id = @old_a_id 
END 

Dies wird dann new_user_id in TableA einfügen, aber das [desc] haben von Ihrem old_user_id

+0

Vielen Dank. Wie kann ich TABELLE B-Daten kopieren? – nav100

+0

Was versuchen Sie mit TableB? Ihr OP ist nicht klar. – Taryn

+0

Ich muss alt a_id aus TABLEA und Abfrage TABLEB und duplizieren. – nav100