none
Ist das möglich ? RRS feed

  • Frage

  • Ist es möglich mit 1 SQL Befehl in 2 Tabellen zu schreiben ?

     

    Ich habe 2 Tabellen und möchte mit 1 Befehl in beide reinschreiben

     

    Tabelle A erhält einen Datensatz und Tabelle B erhält in diesem Befehl dann auch einen Datensatz der sich auf den Datensatz von Tabelle A bezieht den ich gerade erstellt habe. Wie lautet in so einem Fall die ungefähre Syntax wenn das geht !

    Mittwoch, 22. Juni 2011 06:26

Antworten

  • Da gibt es mehrere Möglichkeiten. Wenn Du mit ADO.NET arbeitest, könntest Du mit der SqlTransaction Klasse arbeiten und bei einem Laufzeit-fehler ein Rollback ausführen.

    Direkt in T-SQL geht es mit den BEGIN / COMMIT / ROLLBACK TRANSACTION Befehlen. Hier ein kleines Beispiel; es legt zwei temporäre Tabellen an und versucht dann fehlerhafte

     

    -- Tabellen zum Test anlegen

    CREATE TABLE #Tabelle1 (Feld1 int, Feld2 tinyint);

    CREATE TABLE #Tabelle2 (Feld1 int, Feld2 tinyint);

     

     

    -- 1. Variante über @@error

    BEGIN TRANSACTION;

    INSERT INTO #Tabelle1 (Feld1, Feld2) VALUES (1, 1);      -- Löst keine Fehler aus

    INSERT INTO #Tabelle2 (Feld1, Feld2) VALUES (1, 10000);  -- Löst Fehler aus

    IF @@ERROR = 0

        COMMIT TRANSACTION;

    ELSE

        ROLLBACK TRANSACTION;  

     

     

    -- 2. Variante über TRY/CATCH (ab Sql Server 2005)

    BEGIN TRY
        BEGIN TRANSACTION;

        INSERT INTO #Tabelle1 (Feld1, Feld2) VALUES (1, 1);      -- Löst keine Fehler aus

        INSERT INTO #Tabelle2 (Feld1, Feld2) VALUES (1, 10000);  -- Löst Fehler aus

        COMMIT TRANSACTION;

    END TRY

    BEGIN CATCH

        ROLLBACK TRANSACTION;  

    END CATCH

     

     

     

    -- Kontrolle, was geschrieben wurde

    SELECT * FROM #Tabelle1;

    SELECT * FROM #Tabelle2;

     

    GO

    DROP TABLE #Tabelle1;

    DROP TABLE #Tabelle2;

     


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Mittwoch, 22. Juni 2011 07:05

Alle Antworten

  • Hallo,

    bei der INSERT INTO Anweisung kann man nur eine Tabelle angeben; es ist also nicht möglich, mit einer Anweisung in 2 Tabellen zu schreiben. Was möchtest Du den damit bezwecken?

    Wenn es ein Foreign Key zwischen den Tabellen gibt, musst Du sowieso erst den ersten Datensatz (PK) schreiben, damit der zweite dann überhaupt erst aufgrund des Constraint gespeichert werden kann.


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Mittwoch, 22. Juni 2011 06:37
  • ich möchte also in einem Befehl einen Datensatz in die Tabelle A einfügen und gleichzeitig soll er dir in die Tabelle B einen Datensatz mit Teilaufgabe einfügen der zu dem Datensatz aus der Tabelle A passt

     

    ist etwas schwer zu erklären

     

    Beide Tabellen haben das Feld ProjektID das bei beiden dann auch gleich sein sollte in Tabelle A stehen Projekte und in Tabelle B stehen Teilaufgaben zu den Projekten

    Mittwoch, 22. Juni 2011 06:41
  • Was spricht den gegen 2 INSERT Statement; die Daten zum Einfügen hast Du doch und wenn es in einer Transaction behandelt wird, ist sicher gestellt, das entweder beide oder kein Datensatz geschrieben steht?

    Oder geht es nur darum, ein Statement zu senden? Man kann mehrere Statements als Batch zusammenfassen und dann in einem Command an den SQL Server senden.


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Mittwoch, 22. Juni 2011 06:48
  • Ja genau das meine ich es können ja 2 Inserts sein nur sollte es bei 1 Transaction also z.b. bei Klick eines Buttons ausgeführt werden ... nur wie schreib ich so einen SQL Befehl dann ?
    Mittwoch, 22. Juni 2011 06:51
  • Da gibt es mehrere Möglichkeiten. Wenn Du mit ADO.NET arbeitest, könntest Du mit der SqlTransaction Klasse arbeiten und bei einem Laufzeit-fehler ein Rollback ausführen.

    Direkt in T-SQL geht es mit den BEGIN / COMMIT / ROLLBACK TRANSACTION Befehlen. Hier ein kleines Beispiel; es legt zwei temporäre Tabellen an und versucht dann fehlerhafte

     

    -- Tabellen zum Test anlegen

    CREATE TABLE #Tabelle1 (Feld1 int, Feld2 tinyint);

    CREATE TABLE #Tabelle2 (Feld1 int, Feld2 tinyint);

     

     

    -- 1. Variante über @@error

    BEGIN TRANSACTION;

    INSERT INTO #Tabelle1 (Feld1, Feld2) VALUES (1, 1);      -- Löst keine Fehler aus

    INSERT INTO #Tabelle2 (Feld1, Feld2) VALUES (1, 10000);  -- Löst Fehler aus

    IF @@ERROR = 0

        COMMIT TRANSACTION;

    ELSE

        ROLLBACK TRANSACTION;  

     

     

    -- 2. Variante über TRY/CATCH (ab Sql Server 2005)

    BEGIN TRY
        BEGIN TRANSACTION;

        INSERT INTO #Tabelle1 (Feld1, Feld2) VALUES (1, 1);      -- Löst keine Fehler aus

        INSERT INTO #Tabelle2 (Feld1, Feld2) VALUES (1, 10000);  -- Löst Fehler aus

        COMMIT TRANSACTION;

    END TRY

    BEGIN CATCH

        ROLLBACK TRANSACTION;  

    END CATCH

     

     

     

    -- Kontrolle, was geschrieben wurde

    SELECT * FROM #Tabelle1;

    SELECT * FROM #Tabelle2;

     

    GO

    DROP TABLE #Tabelle1;

    DROP TABLE #Tabelle2;

     


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Mittwoch, 22. Juni 2011 07:05
  • Danke für deine Hilfe das hat mir nun geholfen
    Mittwoch, 22. Juni 2011 08:26