Announcement

Collapse
No announcement yet.

Problem mit Funktion die "Autowert" generiert und Massen-Einfügen

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

  • Problem mit Funktion die "Autowert" generiert und Massen-Einfügen

    Hallo,

    habe ein Datenbank-Einfüge-Problem (SQLServer ) und hoffe, dass es dafür eine (einigermaßen) einfache Lösung gibt oder ich einfach nur einen Denkfehler drin hab...
    Habe eine Tabelle, nennen wir sie mal "T1". Dort gibt es eine Schlüsselspalte "ID". Erster Ansatz beim Erstellen der Tabelle war ein Autowert, hier hat sich das Problem ergeben, dass man die Tabelle in der Praxis durch Einsaugen von Daten restaurieren können soll, d.h. man muss in der Lage sein, manuell einen Wert in die Spalte einzutragen. Da das mit Autowert nicht geht, war der Workaround, eine Funktion zu schreiben, die einen "Autowert" generiert, und diese Funktion wurde dann als Defaultwert eingegeben, so dass, wenn bei einem INSERT die Spalte nicht mit angegeben wird, der Schlüssel über diese Funktion generiert wird. Um es genauer zu sagen: Der Autowert der von der Funktion generiert wird liefert Max(ID)+1 zurück.
    Hat in den letzten Jahren prima funktioniert, da die Anforderung bisher immer nur war, einen einzelnen Datensatz einzufügen, nicht viele auf einmal.
    Jetzt aber sollen viele Daten auf einmal eingefügt werden, genauer: es wird ein INSERT gemacht mit Daten einer anderen Tabelle, wobei in der Spaltenauswahl die ID ausgelassen wird, was ja heißt es soll der Defaultwert verwendet werden. Jetzt funktioniert bei dieser Mehrfach-Einfügung die eigene Autowert-Funktion aber nicht mehr, statt für jeden neu zu machenden Eintrag eine neue Autowert-ID zu generieren, will er immer dieselbe ID einfügen, so als ob die Funktion nur einmal aufgerufen würde und dann für alle einzufügenden Zeilen gesetzt werden würde :-(
    Ich hoffe ich habe das Problem verständlich rübergebracht, ansonsten kann ich auch mal meine Tabellendefinition, die Funktion und die Insert-Abfragen nachliefern.
    Bin für jeden Tipp dankbar...

    thx
    sth_Weird
    Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht

  • #2
    Da das mit Autowert nicht geht
    Stimmt nicht so ganz, man kann mit SET IDENTITY_INSERT ON es so schalten, das man selbst den ID Wert vorgibt.

    Eigene ID-Generator sind immer problematisch, nicht nur bei Massenoperationen, sondern auch im Multi-User Betrieb und anderen Stress-Situationen.

    Um das nun Umzubauen, könntest Du folgenden Weg gehen:
    Lege Dir eine separate Tabelle, wo Du die letzte ID (oder wenn Du mehrere solcher Tabs hast, IDs je Tabelle) ablegst.
    Dann erstellst Du Dir eine Function/Stored Procedure, die Dir den letzten Wert um 1 erhöht und dann diesen Wert zurückliefert.
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Danke für die Tipps.
      hab jetzt aber inzwischen ein anderes Workaround gefunden, das zwar quick&dirty ist, aber für den Zweck funktioniert (ist eigentlich nur ne Einmal-Aktion):
      Ich hab mir ne neue Tabelle erzeugt die genauso aufgebaut ist wie die echte, aber mit nem "richtigen" Autowert, der ein bischen entfernt von der letzten ID der echten Tabelle anfängt. Dann füge ich die Daten ein, die jetzt einen richtigen Autowert bekommen. Und danach kopiere ich die Daten von der tempörären Tabelle in die richtige Tabelle, mit der ID.
      Nicht gerade schön aber für ne Einmal-Aktion ist mir der Aufwand mit Stored Procedure etc zu viel (ich müsste mich nämlich erst mal in das Zeugs einlesen, da ich mich da garnicht auskenne) :-)

      gruß
      sth_Weird
      Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht

      Comment

      Working...
      X