Announcement

Collapse
No announcement yet.

Produktdatenbank mit Daten aus der Warenwirtschaftsdatenbank füttern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • #16
    Achsoo,
    ja ich habe SQL mit Oracle und MySQL gelernt, was man so gelernt nennen kann und da war das so üblich. Aber danke für den Tipp.

    Wie sieht das denn aus, wenn in die Tabelle Werte kopiert werden, wird dann auch einfach die ID hochgezählt (Natürlich leibt die ID beim kopieren außenvor)?

    Comment


    • #17
      Was bedeutet bei dir kopieren? Zeilen oder einzelne Werte oder was?
      Wenn du Zeilen kopieren willst lass die ID weg wenn du Sequenzen benutzt würfel eine neue.

      Comment


      • #18
        Originally posted by Ralf Jansen View Post
        Was bedeutet bei dir kopieren? Zeilen oder einzelne Werte oder was?(...)
        Einzelne Werte.
        Gegenfrage, was meinst du mit würfel eine neue? Ich hätte gerne fortlaufende IDs und keinen gemischten ID-Salat.

        Comment


        • #19
          Originally posted by MFL View Post
          Einzelne Werte.
          Gegenfrage, was meinst du mit würfel eine neue?
          Autoincrement (MS Style):
          Insert ohne Verwendung der Autoincrementspalte

          Sequenz per SQL Insert Statement(Oracle style o.ä. ):
          Der ID Wert wird im Insert Statement generiert, die Spalte muss also mit angegeben werden.
          Entspricht Deiner Variante "dbo.ID_Zaehler.nextval"= "würfeln" = nächsten Wert holen.
          Die sind natürlich wie der Name sagt sequenziell und nicht durcheinander.

          Sequence per Trigger
          Die Verwendung ist analog zum Autoincrement Typ.


          Originally posted by MFL View Post
          Ich hätte gerne fortlaufende IDs und keinen gemischten ID-Salat.
          Nur mal so am Rande. Die Aufgabe eines Primärschlüssels ist es nicht, lückenlos zu sein, sondern eindeutig.
          Das klingt vielleicht nach Erbsenzählerei, in der Praxis verleitet aber der vermeintlich lückenlose, aufsteigende Wert, SQL Statements zu bauen, die im Zweifel (Migration, Korrektureingriff, ...) nicht funktionieren.
          Gruß, defo

          Comment


          • #20
            Ich hätte gerne fortlaufende IDs und keinen gemischten ID-Salat.
            Sowohl eine Sequence als auch ein Autoincrement liefert dir eine Wert enstsprechend deiner Vorgaben. Halt entsprechend dem wie du die definiert hast. Das ist meist einfach stetig steigend aber nicht lückenlos. Außer du schreibst ein vollständig serialisiertes System in dem du garantieren kannst das jeder angeforderter Sequenz oder Increment Wert auch commitet wird (was du nicht kannst).

            Comment


            • #21
              Originally posted by defo View Post
              (...)
              Nur mal so am Rande. Die Aufgabe eines Primärschlüssels ist es nicht, lückenlos zu sein, sondern eindeutig.
              Das klingt vielleicht nach Erbsenzählerei, in der Praxis verleitet aber der vermeintlich lückenlose, aufsteigende Wert, SQL Statements zu bauen, die im Zweifel (Migration, Korrektureingriff, ...) nicht funktionieren.
              Das es hinterher nicht mehr Lückenlos ist, ist klar. Wenn Spalten gelöscht werden entstehen nunmal Lücken.
              Es wäre nur schön wenn da keine Sprünge zwischen wären, von 1000 zu 1000000 o.ä. .
              Wahrscheinlich übernehme ich auch einfach die ID aus der Centron Datenbank und übertrage die einfach mit.

              Womit ich bei meinem nächsten Problem wäre (Tut mir Leid wenn ich hier Sprünge vom Fundament zum Dach, und von der ID zur Prozedur mache):
              CREATE PROCEDURE

              Habe mir den Artikel von Microsoft durchgelesen und musste feststellen das ich damit einige Verständnisprobleme habe.
              Wie ich schon im ersten beitrag geschrieben habe, möchte ich mit einer Transaktion Daten von einer Datenbank in eine andere Datenbank schieben.
              Da ich mich aber gerade noch in MS SQL einarbeite, habe ich mir erstmal eine TestDB aufgebaut mit 2 Tabellen (dbo.Test1 mit den Spalten Test1_ID(PK) und Testfeld1 und dbo.Test2 mit den Spalten Test2_ID(PK) und Testfeld2).
              Jetzt habe ich erstmal einen Trigger geschrieben, welcher reagiert 'bevor' in dbo.Test1 etwas "geinsertet" wird in dbo.Test2 ein incrementeller wert geschrieben. Hat auch super funktioniert.
              Jetzt möchte ich aber mit dem Trigger eine Prozedur aufrufen welche die werte, welche in dbo.Test1 geschrieben werden in 2 Variablen packt und anschließend ebenfalls in dbo.Test 1 schreibt.
              Jetzt bin ich aber mit der Prozedur-Anleitung von Microsoft heillos überfordert, mit den ganzen Schemas den Typen der Parameter und co.

              Es wäre nett, wenn jemand von euch einen Beispielcode für eine Procedur hätte, welcher auf das mindeste runtergebrochen ist
              oder eine Erklärung für folgende weiterführenden Fragen hätte:
              Code:
              SET ANSI_NULLS ON              --Wofür steht dieser Befehl?
              GO
              SET QUOTED_IDENTIFIER ON   --und wofür dieser?
              GO
              
              CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName> --muss ich hier 2 Procedurnamen angeben und wofür steht 'sysname'?
              	-- Add the parameters for the stored procedure here
              	<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>, --hier gibt es ebenfalls ein @Param1 und ein @P1, wieso kommt MS SQL nicht einfach mit einem Paramaternamen, einen Datentyp und einen Wert aus?
              	<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
              AS
              BEGIN
              
                  -- Insert statements for procedure here
              	SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
              END
              GO

              Comment


              • #22
                Ähm in der von dir verlinkten Hilfe sind reichlich Beispiele. Wir könnten jetzt eins von denen hier wiederholen aber das hilft wohl kaum?

                Comment


                • #23
                  Deshal habe ich auch schonmal ein Beispiel hier rein gesetzt und mit Hilfe von kommentaren meine Fragen in den Code geschrieben.
                  Wenn ich die beantwortet hätte, würde mir das schon helfen

                  Comment


                  • #24
                    manchmal mache ich es ein wenig kompliziert
                    Also, mal vereinfacht gefragt:
                    -wie bennen ich die Funktion (syntaktisch, mit Parameter_Name und Synname)
                    -wie deklariere ich einen Parameter (syntaktisch, mit Parameter_Name, Synname, Typ und Startwert)
                    -wie schreibe ich einen selektierten Wert in einen Paramter und
                    -wie schreibe ich den Parameterwert wieder in eine Spalte in einer anderen Tabelle.

                    Hoffe das konkretisiert meine Probleme

                    Comment


                    • #25
                      Lass dich nicht von dem Stored Procedure Template aus dem Management Studio verwirren. Wie eine Procedure auszusehen hat kann man dem Beispielen in der Hilfe denke ich sehr deutlich entnehmen. Für dich am ehesten passend ist wahrscheinlich das 'Update_VacationHours' Beispiel.

                      Comment


                      • #26
                        Ja vielen Dank für die schnellen Antworten.

                        Das letzte Beispiel ist fast perfekt.

                        Comment


                        • #27
                          Hallo nochmal,

                          folgendermaßen sieht der Code für meine Procedur aus:
                          Code:
                           
                          create PROCEDURE Kopieren
                          (
                          
                          @Testfeld_var VARCHAR,
                          @ID_var int,
                          @maxID int
                          
                          )
                          
                          AS
                          BEGIN
                          Select max(ID_Test_1) into @maxID from dbo.Test_1;
                          Select ID_Test_1 into ID_var from dbo.Test_1 where ID_Test_1 = @maxID;
                          Select Testfeld_1 into @Testfeld_var from dbo.Test_1 where ID_Test_1 = @maxID;
                          INSERT INTO dbo.Test_2 (ID_Test_2,Testfeld_2) values(@ID_var, @Testfeld_var);
                          
                          
                          END;
                          und folgende Fehlermeldung wird ausgespuckt:
                          "Meldung 102, Ebene 15, Status 1, Prozedur Kopieren, Zeile 12
                          Falsche Syntax in der Nähe von '@maxID'.
                          Meldung 102, Ebene 15, Status 1, Prozedur Kopieren, Zeile 14
                          Falsche Syntax in der Nähe von '@Testfeld_var'."


                          Ich in schon mal froh, dass ich das ganze auf 2 Fehlermeldungen minimieren konnte, nachdem ich
                          hier den von mir eingebauten Oracle-Code in MS_SQL-Code umgestückelt habe.
                          Leider weiß ich nicht was genau sein Problem ist. Wenn ich mit der Maus über '@maxID' und '@Testfeld' gehe
                          gibt er mir noch folgenden Hinweiß:
                          "Falsche Syntax in der Nähe von '@maxID'. Erwartet wird '.', ID, oder QUOTED_ID"

                          Jemand eine Idee was mir der MS SQL-Querybrowser damit sagen möchte?

                          Comment


                          • #28
                            ähhh... das es diese 'into' Formulierung bei Microsoft so nicht gibt ?

                            Aber ich hatte am Anfang mal gefragt, was genau du vor hast - so richtig klar ist mir das noch immer nicht -

                            Comment


                            • #29
                              Originally posted by tömmel View Post
                              ähhh... das es diese 'into' Formulierung bei Microsoft so nicht gibt ?

                              Aber ich hatte am Anfang mal gefragt, was genau du vor hast - so richtig klar ist mir das noch immer nicht -
                              Schön, wie erkläre ich das nur

                              also ich habe 2 Tabellen, eine dbo.Test_1 und eine dbo.Test_2.
                              Sobalt ein Wert in die dbo.Test1 geschrieben wird
                              Code:
                               insert into dbo.Test_1 (ID_Test_1, Testfeld_1) values (1,'Hans-Peter')
                              soll dieser Wert 1:1 in die Tabelle dbo.Test_2 geschrieben werden.

                              So, dieses 'into' habe ich von Oracle-SQL geklaut aus einer Funktion die ich früher schonmal während des Fachabiturs geschrieben habe. Die funktionierte, jetzt sitze ich vor MS SQL und fange wieder von vorne an, teilweise ist das gerade echt ätzend.

                              Comment


                              • #30
                                Um mal zu Zeigen wie so eine ähnliche Procedur in oracle aussieht:

                                Code:
                                create or replace PROCEDURE EINTRAG
                                (
                                Vornamein IN VARCHAR2,
                                Namein IN VARCHAR2,
                                Hobbyin IN VARCHAR2
                                )
                                AS
                                id_p int := NULL;
                                id_h int := NULL;
                                BEGIN
                                Select NUMMER into id_p from T_Mitglieder where Vorname = Vornamein and
                                Nachname = Namein;
                                Select NUMMER into id_h from T_Hobby where Bezeichnung = Hobbyin;
                                INSERT INTO T_Zuordnung (Nummer,Person,Hobby) values(idzu.nextval,id_p,id_h);
                                // Exception
                                exception
                                when dup_val_on_index
                                then DBMS_OUTPUT.PUT_LINE ('Fehler: Kombination schon vorhanden');
                                when invalid_number
                                then DBMS_OUTPUT.PUT_LINE ('Fehler: Keine Daten gefunden');
                                END EINTRAG;
                                Die Prozedur schreibt anhand der Keys die IDs in eine Zuordnungstabelle.

                                Aber ich habs endlich geschafft, so siehts dann aus ;-)

                                Code:
                                create PROCEDURE Kopieren
                                (
                                
                                @Testfeld_var VARCHAR,
                                @ID_var int,
                                @maxID int
                                
                                )
                                
                                AS
                                BEGIN
                                Select @maxID = max(ID_Test_1) from dbo.Test_1;
                                Select @ID_var = ID_Test_1 from dbo.Test_1 where ID_Test_1 = @maxID;
                                Select @Testfeld_var = Testfeld_1  from dbo.Test_1 where ID_Test_1 = @maxID;
                                INSERT INTO dbo.Test_2 (ID_Test_2,Testfeld_2) values(@ID_var, @Testfeld_var);
                                
                                
                                END;
                                Zuletzt editiert von MFL; 28.11.2012, 17:37.

                                Comment

                                Working...
                                X