Announcement

Collapse
No announcement yet.

Laufnummer erzeugen ?

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

  • Laufnummer erzeugen ?

    Wie kann ich in einer Abfrage eine Laufnummer erzeugen ?

    Ich möchte Z.B. beim

    SELECT Kunde_ID, Vorname, Nachname FROM Kunde

    auch eine Laufnummer nur für diese Abfrage generieren...

    wie kann ich das realisieren ?

  • #2
    Z.B. mit einer Mini-Table, die nur eine Nr. enthält und sonst nichts. Damit die Nr. läuft braucht sie noch eine SP in der Art:

    CREATE PROCEDURE RECNRSP
    RETURNS (
    RECNR INTEGER)
    AS
    DECLARE VARIABLE NEUERECNR INTEGER;
    begin
    NEUERECNR = -1;
    select NR from RECNR into :NEUERECNR;
    if (NEUERECNR < 0) then begin
    insert into RECNR (NR) values (1);
    RECNR = 1; /* Table RECNR leer : mit 1 beginnen */
    end
    else begin
    update RECNR set NR = NR + 1;
    RECNR = NEUERECNR + 1;
    end
    suspend;
    end

    Comment


    • #3
      Um die Sicherheit vor "Kollisionen" im Netzwerk zu vermeiden (Doppelte IDs im Mehrbenutzerbetrieb) habe ich auf Laufnummern als Format verzichtet und lasse statt dessen (auch von einer Stored Procedure des DB-Servers) eine Zufallszahl generieren. Die Tabelle im Beispiel von H.J. Oswald enthält bei mir dann nur die vergebenen Nummern (wenn dort eine schon existiert wird eine neue erzeugt

      Comment


      • #4
        Zur Klarstellung : ich sprach von einer Minimal-Tabelle. Und die hat auch keine IDs oder sonstwas. Hier ist die KOMPLETTE Tabelle :

        CREATE TABLE RECNR (
        NR INTEGER
        )

        Comment


        • #5
          Hallo,
          die Mehrbenutzer-Sicherheit bei einer derartigen Hilfstabelle lässt sich auch verbessern, wenn der einzige Zugriff sofort einen X-Lock auf den einzigen Datensatz der Tabelle setzt und die UPDATE-Anweisung gleich den neuen Wert zurückliefert:
          <code>
          <b>CREATE</b> <b>PROCEDURE</b> spGetNextID
          (
          @NewID <b>INT</b> <b>OUTPUT</b>
          )
          <b>AS</b>
          <b>BEGIN</b>
          <b>UPDATE</b> dbo.LastID <b>SET</b> @NewID = id = id + 1;
          <b>END</b>
          <b>GO</b>
          </code>
          Ansonsten könne auch beim vorherigen SELECT ein Table-Hint das Verhalten verbessern, um das schmale Zeitfenster für eine potentielle Kollision zu schließen:
          <code>
          select NR from RECNR <b>WITH (UPDLOCK) </b>
          </code&gt

          Comment

          Working...
          X