none
Wie schreibt man am besten Daten in 1:n Tabellen RRS feed

  • Frage

  • Hallo zusammen,

    ich nutze seit kurzem einen SQL-Server 2008 R2 als Back-End für meine Access 2013 Datenbanken. Die Daten-Abfrage mittels stored Procedures funktioniert einwandfrei.

    Jetzt stellt sich mir die Frage, wie kann man Daten am effektivsten aus Access heraus in 1:n verknüpfte Tabellen schreiben ??

    Dabei soll zuerst geprüft werden, ob in der 1-Tabelle der Wert schon vorhanden ist, Wenn nein soll eine neuer Datensatz angelegt werden. Anschließend soll dann in die n-Tabelle der Wert geschrieben werden, incl. der ID der 1-Tabelle.

    Ich kann mir 2 vorgehensweisen vorstellen

    1. Mittels ODBC o.ä. - Ich denke aber die performance lässt hier zu wünschen übrig

    2. Stored Procedure - Hier habe ich aber trotz intensiver Suche keine Beispiele im Netz gefunden, trotz dieser grundlegenden Aufgabe, sodass ich mir nicht sicher bin, ob ich hier auf dem richtigen Weg bin.

    Für Hilfe bei dieser Problemstellung im voraus vielen Dank

    Gruß

    Andreas

    Donnerstag, 25. Februar 2016 07:56

Antworten

  • Hallo Andreas,

    ODBC ist die Datenzugriffskomponente, Stored Procedure ist T-SQL; zwei verschiedene paar Schuhe.

    Stored Procedure bieten sich immer gut an, um die Logik, was wie wohin geschrieben wird, zentral in der Datenbank liegt, das muss der Client nicht wissen/können.

    Hier ein einfaches Beispiel, eine Tabelle Adressen und eine Referenztabelle mit den Orten. Die Stored Procedure fügt fehlende Referenzdaten "Ort" ein, falls sie noch nicht vorhanden sind und fügt neue Adressen ein/aktualisiert vorhanden. Ist nur als simples Beispiel gedacht:

    CREATE TABLE dbo.Ort
        (PLZ CHAR(5) NOT NULL PRIMARY KEY,
         Ortsname VARCHAR(50) NOT NULL);
    
    CREATE TABLE dbo.Adresse
        (Name VARCHAR(50) NOT NULL PRIMARY KEY,
         Strasse VARCHAR(50) NOT NULL,
         PLZ CHAR(5) NOT NULL);
    
    ALTER TABLE dbo.Adresse ADD CONSTRAINT
    	FK_Adresse_Ort_PLZ FOREIGN KEY(PLZ) 
        REFERENCES dbo.Ort (PLZ);
    GO
    
    CREATE PROCEDURE dbo.spAddAddress
        (@name VARCHAR(50),
         @strasse VARCHAR(50),
         @plz CHAR(5),
         @ortsname VARCHAR(50))
    AS
    BEGIN
        SET NOCOUNT ON;
    
        -- Referenzdaten einfügen, wenn nicht vorhanden
        IF NOT EXISTS (SELECT 1 FROM dbo.Ort WHERE PLZ = @plz)
        BEGIN
            INSERT INTO dbo.Ort
               (PLZ, Ortsname)
            VALUES
               (@plz, @ortsname);
        END;
    
        -- Adresse einfügen, wenn nicht vorhanden
        IF NOT EXISTS (SELECT 1 FROM dbo.Adresse WHERE Name = @name)
        BEGIN
            INSERT INTO dbo.Adresse
                (Name, Strasse, PLZ)
            VALUES
                (@name, @strasse, @plz);
    
            SELECT 'Eingefügt' AS Ergebnis
        END
        ELSE
        BEGIN
            UPDATE dbo.Adresse
            SET Strasse = @strasse,
                PLZ = @plz
            WHERE Name = @name;
    
            SELECT 'Aktualisiert' AS Ergebnis
        END;
    END
    GO
    
    -- Tests
    EXEC dbo.spAddAddress 'Max Mustermann', 'Musterallee', '12345', 'Musterort';
    EXEC dbo.spAddAddress 'Peter Pan', 'Niemandstraße', '23456', 'Niemandsland';
    -- Max zieht um
    EXEC dbo.spAddAddress 'Max Mustermann', 'Musterallee', '34567', 'Irgendwo';


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert Fetzo Donnerstag, 25. Februar 2016 09:42
    Donnerstag, 25. Februar 2016 09:07

Alle Antworten

  • Hallo Andreas,

    ODBC ist die Datenzugriffskomponente, Stored Procedure ist T-SQL; zwei verschiedene paar Schuhe.

    Stored Procedure bieten sich immer gut an, um die Logik, was wie wohin geschrieben wird, zentral in der Datenbank liegt, das muss der Client nicht wissen/können.

    Hier ein einfaches Beispiel, eine Tabelle Adressen und eine Referenztabelle mit den Orten. Die Stored Procedure fügt fehlende Referenzdaten "Ort" ein, falls sie noch nicht vorhanden sind und fügt neue Adressen ein/aktualisiert vorhanden. Ist nur als simples Beispiel gedacht:

    CREATE TABLE dbo.Ort
        (PLZ CHAR(5) NOT NULL PRIMARY KEY,
         Ortsname VARCHAR(50) NOT NULL);
    
    CREATE TABLE dbo.Adresse
        (Name VARCHAR(50) NOT NULL PRIMARY KEY,
         Strasse VARCHAR(50) NOT NULL,
         PLZ CHAR(5) NOT NULL);
    
    ALTER TABLE dbo.Adresse ADD CONSTRAINT
    	FK_Adresse_Ort_PLZ FOREIGN KEY(PLZ) 
        REFERENCES dbo.Ort (PLZ);
    GO
    
    CREATE PROCEDURE dbo.spAddAddress
        (@name VARCHAR(50),
         @strasse VARCHAR(50),
         @plz CHAR(5),
         @ortsname VARCHAR(50))
    AS
    BEGIN
        SET NOCOUNT ON;
    
        -- Referenzdaten einfügen, wenn nicht vorhanden
        IF NOT EXISTS (SELECT 1 FROM dbo.Ort WHERE PLZ = @plz)
        BEGIN
            INSERT INTO dbo.Ort
               (PLZ, Ortsname)
            VALUES
               (@plz, @ortsname);
        END;
    
        -- Adresse einfügen, wenn nicht vorhanden
        IF NOT EXISTS (SELECT 1 FROM dbo.Adresse WHERE Name = @name)
        BEGIN
            INSERT INTO dbo.Adresse
                (Name, Strasse, PLZ)
            VALUES
                (@name, @strasse, @plz);
    
            SELECT 'Eingefügt' AS Ergebnis
        END
        ELSE
        BEGIN
            UPDATE dbo.Adresse
            SET Strasse = @strasse,
                PLZ = @plz
            WHERE Name = @name;
    
            SELECT 'Aktualisiert' AS Ergebnis
        END;
    END
    GO
    
    -- Tests
    EXEC dbo.spAddAddress 'Max Mustermann', 'Musterallee', '12345', 'Musterort';
    EXEC dbo.spAddAddress 'Peter Pan', 'Niemandstraße', '23456', 'Niemandsland';
    -- Max zieht um
    EXEC dbo.spAddAddress 'Max Mustermann', 'Musterallee', '34567', 'Irgendwo';


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert Fetzo Donnerstag, 25. Februar 2016 09:42
    Donnerstag, 25. Februar 2016 09:07
  • Hallo Olaf,

    erst einmal vielen Dank für die Unterstützung.

    bzgl ODBC: Ich gebe zu, ich habe mich da etwas missverständlich ausgedrückt. ICh habe mit ODBC eine in Access via ODBC verknüpfte Tabelle gemeint.

    Viele Grüße

    Andreas

    Donnerstag, 25. Februar 2016 09:42
  • Am 25.02.2016 schrieb Fetzo:

    ICh habe mit ODBC eine in Access via ODBC verknüpfte Tabelle gemeint.

    Wenn Du neu anfängst, lass es bleiben. Ein FE ohne verknüpfte Tabellen
    hat was, und ist sehr schnell. ;)

    Bernd Jungbluth hat auf der AEK 17 einen tollen Vortrag zu diesem
    Thema gehalten. Downloade die Dateien und schau dir das alles in Ruhe
    an: http://donkarl.com/Downloads/AEK/AEK17_LogikSQLServer.zip In einem
    der SQL-Scripte findest Du eines mit MERGE als Lösung. Schau dir das
    an, hilft ungemein.
    https://msdn.microsoft.com/de-de/library/bb510625%28v=sql.120%29.aspx

    Hier sind auch ein paar Lösungsvorschläge zu finden:
    http://stackoverflow.com/questions/108403/solutions-for-insert-or-update-on-sql-server
    http://stackoverflow.com/questions/21208719/update-if-exists-else-insert-in-sql-server-2008

    Servus
    Winfried


    WSUS Package Publisher: http://wsuspackagepublisher.codeplex.com/
    HowTos zum WSUS Package Publisher http://www.wsus.de/wpp
    GPO's: http://www.gruppenrichtlinien.de
    NNTP-Bridge für MS-Foren: http://communitybridge.codeplex.com/

    Donnerstag, 25. Februar 2016 19:53