Announcement

Collapse
No announcement yet.

Wie schreibt man einen Insert Befehl mit hochgezähltem Indexwert in eine Tabelle?

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

  • #16
    Originally posted by HPeters View Post
    Also das Script auf 1 zu limitieren ist ja auch nicht die Lösung,
    Wenn Du es automatisierst, mit einem Cron Job bzw. eher mit einem Scheduler Task unter Windows, dann kannst Du auch einen Mehrfachaufruf automatisieren.
    Jeder Aufruf verarbeitet nur einen Datensatz, damit erreichst Du, dass Dein Script sauber läuft und selbst wenn Dein Kollege nachschicht macht und auch was einfügt alles okay wäre. (Soweit das mit dem Verfahren max(id), das ja auch der Hersteller nutzt eben möglich ist)
    Die Automatisierung muss halt automatisch oft genug aufgerufen werden. Dazu müsste die Automatik von der Einzeloperation einen Rückgabewert bekommen, der sagt, ob es noch mal laufen muss.

    Das ist alles nicht schön und allein der Thread hier ist schon mehr Arbeit, als es den Hersteller kosten würde, seine ID richtig zu verwalten. Aber offenbar gibt es ja keine Entgegenkommen.
    Gruß, defo

    Comment


    • #17
      Ich finde den Vorschlag von defo auch sehr gut. Das wäre vermutlich auch das was ich gemacht hätte in dem Fall.

      Comment


      • #18
        Originally posted by defo View Post
        Die Automatisierung muss halt automatisch oft genug aufgerufen werden. Dazu müsste die Automatik von der Einzeloperation einen Rückgabewert bekommen, der sagt, ob es noch mal laufen muss.
        Puh, wieder was neues. Wie setzt man denn so was um?

        Comment


        • #19
          Es gibt ein Prinzip, das nennt sich devide and conquer, kannst Du mal googlen.

          Du hast selbst davon gesprochen, dass Du den Aufruf automatisieren willst. Also musst Du ja eine Vorstellung haben, wie das mit deinen Softwarewerkezuegen geht, als SQL>MSSQL StoredProcedure>MS Windows Aufgabenplaner.
          Dein SQL Statement hast Du, häng ein Limit 1 an das Select Statement und Du bist fertig.
          Dann kannst Du pro Taskplaneraufruf einen Datensatz verarbeiten.
          Damit kannst Du nichts kaput oder falsch machen.
          Wenn das läuft, kommt die Vervielfachung. Aber eins nach dem anderen. Würdest Du es bis hier her hinbekommen?

          Eine SP, die nicht nur die Insertaufgabe erledigt, sondern zusätzlich einen Rückgabewert liefert, der die Anzahl der offenen Datensätze ausgibt, würdest Du auch hinbekommen oder?
          Ich muss an der Stelle sagen, dass ich seit längerer Zeit weder MSSQL noch Windows Taskplaner aktiv nutze und damit nur bedingt aktuelle Ratschläge dazu geben kann.
          Gruß, defo

          Comment


          • #20
            Also ich hatte mich da wohl falsch ausgedrückt. Ich würde keinen geplanten Task von Windows benutzen, sondern eine zeitgesteuerten Auftrag im SQL-Server-Agent einrichten. Das habe ich bereits geamacht. Den Auftrag würde ich dann jede Nacht starten lassen.

            Originally posted by defo View Post
            Eine SP, die nicht nur die Insertaufgabe erledigt, sondern zusätzlich einen Rückgabewert liefert, der die Anzahl der offenen Datensätze ausgibt, würdest Du auch hinbekommen oder?
            Das mit dem Rückgabewerte, wüßte ich überhaupt nicht wie das geht. Zumal man ja mit diesem Rückgabewert dann die Ausführung des SQL_Server-Agent Auftrages unterdrücken bzw. anhalten müsste. Und dann am nächsten Tag irgend wie wieder aktivieren. Ob das da funktioniert ???
            Zumal der Auftrag ja für jeden anstehenden einzelnen zu schreibenden Datensatz erneut gestartet werden müsste.
            Zuletzt editiert von HPeters; 23.03.2018, 10:01.

            Comment


            • #21
              Originally posted by HPeters View Post
              Also ich hatte mich da wohl flasch ausgedrückt. Ich würde keinen geplanten Task von Windows benutzen, sondern eine zeitgesteuerten Auftrag im SQL-Server-Agent einrichten. Das habe ich bereits geamacht. Den Auftrag würde ich dann jede Nacht starten lassen.
              ..
              Vielleicht hab ich Dich auch falsch verstanden.
              Funktioniert das denn mit Limit 1?

              Die Konfigurationsmöglichkeiten für den Server Agent kenne ich leider nicht bzw. es ist wirklich ewig her. Meine Erwartung wäre aber, dass er sowas können sollte.
              Gruß, defo

              Comment


              • #22
                Hallo zusammen,

                ich habe jetzt eine Lösung gefunden.

                Code:
                Insert into Wartung (ID,Seriennummer)
                Select (Select Max(Wartung.ID) from Wartung) + ROW_NUMBER () cover (Order by Auslieferung.SN ASC) as ID,
                       Auslieferung.Seriennummer
                From   Auslieferung
                left outer join Wartung on Auslieferung.Seriennummer= Wartung.Seriennummer
                Where  Wartung.Seriennummer is NULL
                So funktioniert es.
                Der Trick dabei ist, dass die im Select zusammengesuchten Daten, die ja in die Tabelle Wartung eingefügt werden sollen, eine Nummerierung (ROW_NUMBER) der Datensätze stattfindet, die dann auf die höchste ID (vor dem Hinzufügen der Datensätze) aufaddiert wird.
                " Select Max(Wartung.ID) from Wartung) + ROW_NUMBER () cover (Order by Auslieferung.SN ASC) as ID"
                Die Durchnummerierung der Datensätze erfolgt folgendermaßen: 1. Datensatz = 1; 2. Datensatz = 2; usw.
                Und die ID, die in die Tabelle Wartung geschrieben werden soll, ergibt sich wie folgt: Max ID + 1 (für 1. Datensatz); Max ID +2 (für 2. Datensatz), usw.

                Gruß HPeters

                Comment


                • #23
                  Originally posted by HPeters View Post
                  Hallo zusammen,

                  ich habe jetzt eine Lösung gefunden.
                  Prima! Hätte man drauf kommen können.
                  Eine Window Function ist zwar ein Hammer für das Problem, aber es sieht nach einem brauchbaren Workaround aus.
                  "cover" soll wahrscheinlich "over" heißen.
                  Gruß, defo

                  Comment


                  • #24
                    Natürlich over nicht cover. DAs war ein Tippfehler.
                    Hier jetzt korrigiert:

                    Code:
                    Insert into Wartung (ID,Seriennummer)
                    Select (Select Max(Wartung.ID) from Wartung) + ROW_NUMBER () over (Order by Auslieferung.SN ASC) as ID,
                           Auslieferung.Seriennummer
                    From   Auslieferung
                    left outer join Wartung on Auslieferung.Seriennummer= Wartung.Seriennummer
                    Where  Wartung.Seriennummer is NULL

                    Comment

                    Working...
                    X