Announcement

Collapse
No announcement yet.

Freie ID suchen

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

  • Freie ID suchen

    Hallo zusammen,

    ich arbeite mit einer Tabelle bei der ich leider die ID Spalte (integer) nicht auf IDENTITY stellen kann. Ich muss nun aus einem C#-Programm heraus neue Datensätze erstellen. Dafür benötige ich natürlich einen Integer-Wert, der noch nicht als ID vergeben ist.

    Eine Möglichkeit einen freien Integerwert zu bekommen wäre "SELECT MAX(ID) FROM TABLE" und dann +1, dummerweise gibt es in der Tabelle einige Lücken und ich fände es sehr genial, wenn ich die niedrigste freie ID erhalten könnte. Weiss jemand, ob es dafür einen Befehl in SQL/T-SQL/MSSQL gibt?

    Vielen Dank!

  • #2
    Code:
    select TOP 1 RowNumber as FirstUnusedID
      from (select ROW_NUMBER() over(order by PK) as RowNumber, PK 
                 from Table) T 
     where  RowNumber <> PK
    Wird wohl bei einer größeren Tabelle elendig langsam sein, aber kannste ja mal ausprobieren.

    Persönlich würde ich die Lücken ignorieren. Ist eh nur der Primärschlüssel und auch bei einem Identity Feld als PK hättest du durch Löschoperationen Lücken.

    Comment


    • #3
      Hallo,

      ..wenn ich die niedrigste freie ID erhalten könnte.
      ein Primärschlüssel soll einen Datensatz in der Menge logisch eindeutig addressieren, so dass der tatsächliche Wert völlig egal ist. Daher ist es sinnvoll, IDENTITY zu nutzen und eventuelle Lücken zu ignorieren.

      Wenn man eigene Nummern vergeben will und das auch im Mehrbenutzerbetrieb in jedem Fall funktionieren soll, muss man die Zugriffe in eine explizite Transaktion kapseln und die Tabelle mit dem aktuellen Zählerstand vor dem Auslesen des Wertes exklusiv sperren. Oder man nutzt eine Hilfstabelle, wie das folgende Beispiel zeigt:

      Code:
      USE tempdb 
      GO 
      
      -- Hilfstabelle
      CREATE TABLE LastID 
      ( 
        id INT NOT NULL PRIMARY KEY 
      ) 
      GO 
      INSERT INTO LastID (id) VALUES (0); 
      GO 
      
      -- Prozedur liefert neuen Wert zurück
      CREATE PROCEDURE spGetNextID 
      ( 
        @NewID INT OUTPUT 
      ) 
      AS 
        BEGIN 
          UPDATE dbo.LastID SET @NewID = id = id + 1;
        END 
      GO 
      
      -- Testen 
      DECLARE @i INT 
      EXEC spGetNextID @i OUTPUT 
      PRINT @i

      Comment


      • #4
        Danke für eure Antworten!

        Comment

        Working...
        X