Announcement

Collapse
No announcement yet.

Hochzählen und insert

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

  • Hochzählen und insert

    Hi,
    ich habe eine Tabelle, die eine eindeutige Spalte hat.

    Die Spalte wird nicht automatisch durch die Spaltendefinition hochgezählt, sondern jeweils beim Insert aus einer andern Tabelle gezählt (dort ist die jeweils nächste Nummer vorgegeben, und diese wird +1 erhöht nach Insert in Tabelle eins).

    Fragt nicht, warum das so ist.... ist eine alte Datenbank, eine vorgegebene Installation - kann ich so nix dran ändern.

    Nun setze ich die Zähltabelle auf z.B. 10000 nach oben, so daß bei den nächsten autpmatischen Inserts eine Lücke entsteht. Also so in der Art:

    Code:
    100
    101
    102
    103
    104
    105
    10000   <- hier war die Erhöhung in der Zähltabelle
    10001
    10002
    Die Zeilen zwischen 105 und 100105 möchte ich jedoch nun mit einem insert auffüllen, sozusagen als Platzhalter.

    Also sollte ich jetzt ein Script haben, das schaut, welches die letzte Nummer unterhalb 10000 ist, und sollte solange auffüllen, bis ich auf 9999 bin.

    Ich könnte die Zeilen zwar auch im Excel erstellen und 9895 Insertzeilen basteln. Aber da ich am Tag x, an dem ich diese Lücke benötige, nicht viel Zeit hab, wäre das mit einem kompletten Script, das variabel an den Startwert anschließt und bis zu einem festgelegten Endwert (9999) zählt, schon schicker.

    Zumal ich keine rund 10.000 sondern schlappe 150.000 benötige...

    Irendwie Idee? Irgendwas schleifiges? (hab ich aber keine Ahnung davon...)

  • #2
    Hallo Avhy,

    genau, eben eine Schleife; nicht schön, aber geht:
    [highlight=SQL]SET NOCOUNT ON; -- besser ist es

    CREATE TABLE #nums (nummer int);
    INSERT INTO #nums VALUES (107);
    INSERT INTO #nums VALUES (10700);
    GO

    DECLARE @nextNum int;

    SELECT @nextNum = MAX(nummer) + 1
    FROM #nums
    WHERE nummer < 10700;

    WHILE @nextNum < 10700
    BEGIN
    INSERT INTO #nums VALUES (@nextNum);
    SET @nextNum = @nextNum + 1;
    END
    GO
    SELECT COUNT(*)
    FROM #nums
    GO

    DROP TABLE #nums;[/highlight]

    Wenn die Eckpunkte nicht so fest stehen, musst Du die halt noch mitselektieren.
    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
      Dankeschön! Du hast mir super weitergeholfen - während ich in der Kantine beim futtern saß

      DANKEEEEEEEEEEEEEEEEEE!

      Comment


      • #4
        Originally posted by O. Helper View Post
        Hallo Avhy,

        genau, eben eine Schleife; nicht schön, aber geht:
        [highlight=SQL]SET NOCOUNT ON; -- besser ist es

        CREATE TABLE #nums (nummer int);
        INSERT INTO #nums VALUES (107);
        INSERT INTO #nums VALUES (10700);
        GO

        DECLARE @nextNum int;

        SELECT @nextNum = MAX(nummer) + 1
        FROM #nums
        WHERE nummer < 10700;

        WHILE @nextNum < 10700
        BEGIN
        INSERT INTO #nums VALUES (@nextNum);
        SET @nextNum = @nextNum + 1;
        END
        GO
        SELECT COUNT(*)
        FROM #nums
        GO

        DROP TABLE #nums;[/highlight]

        Wenn die Eckpunkte nicht so fest stehen, musst Du die halt noch mitselektieren.
        ohne Schleife:
        Code:
        BEGIN TRAN;
        CREATE Table dbo.Numbers (num INT);
        DECLARE @Min INT, @Max INT; 
        SELECT @Min = 105, @Max = 10000;
        WITH n AS 
           (   SELECT x = @Min    UNION ALL   
               SELECT x = x + 1     
               FROM n     
               WHERE x < @Max
           )
            INSERT INTO Numbers (Num)  
            SELECT x  FROM n  OPTION (MAXRECURSION 32767);
            
        SELECT * FROM Numbers;
        
        ROLLBACK;
        wenn mehr als 32767 Zeilen sein sollen, dann siehe auch:
        bad-habits-to-kick: using-a-loop-to-populate-a-table

        Comment

        Working...
        X