/ / Liste der freien Zahlen zwischen X und Y abrufen Kreisartig - SQL-Server, tsql

Liste der freien Zahlen zwischen X und Y abrufen - SQL-Server, Tsql

Ich habe eine Tabelle mit Zahlen zwischen 1000 und 9999.

DECLARE @TempTable Table(index int,IsFree bit)
DECLARE @Max int,@Rows int
SET @Max=0

Das IsFree auf wahr setzen.

Am ersten Tag kann ein Benutzer die Anzahl der Zeilen auswählen, z. B. 300, Die ersten 300 von 1 bis 300 werden auf false gesetzt und der Benutzer erhält alle Zeilen zwischen 301 und 9999.

UPDATE @TempTable
SET IsFree=0
WHERE index>=@Max
AND index < @Max+@Rows

An Tag 2 kann der Benutzer 400 auswählen. Ich möchte also, dass die Zeilen 301 bis 700 auf false gesetzt werden und der Benutzer die Zeilen 701 bis 9999 erhält.

SELECT TOP 1 @Max=index
FROM @TempTable
WHERE IsFree=0
ORDER BY index

Die ersten 300 können auf true gesetzt werden, sind aber nicht erforderlich.

Ich meine, dass der maximale Zeilenindex mit dem Wert true + 1 jeden Tag die erste Zeile ist, die false + die Anzahl der vom Benutzer ausgewählten Zeilen aktualisiert.

Mein Problem beginnt, wenn ich das Ende desIn der Tabelle ist beispielsweise der maximale Zeilenindex mit true 9990 und der Benutzer wählt 100 aus. Zeile 9991-9999 sollte auf false gesetzt werden, und alle Zeilen mit dem Wert true von 1 bis 90 werden auf false gesetzt. Das Problem ist, wie man am nächsten Tag festlegt, wie man findet, dass Zeile 91 die erste Zeile ist, die aktualisiert wird.

Antworten:

0 für die Antwort № 1

Wenn der Index "hinter" dem Start liegt, können Sie einen "fiktiven Index" verwenden, wenn index + 10000, damit er dem Ende der Sequenz folgt

    DECLARE @TempTable Table([index] int,IsFree bit)
DECLARE @Max int,@Rows int
SET @Max=0

DECLARE @I int = 0;

WHILE @I <= 10000
BEGIN
INSERT @TempTable VALUES(@I, "true");
SET @I = @I + 1;
END

SET @MAX = 9900;
SET @ROWS  =1000;

--rows selected
WITH FREE AS (SELECT [index],
IsFree,
CASE WHEN [index] < @MAX THEN  [index] + 10000 ELSE [index] END as NotionalRow
FROM @TempTable)
SELECT * FROM FREE WHERE NotionalRow>=@Max
AND NotionalRow < @Max+@Rows ORDER BY NotionalRow;


--you can update over a WITH statement
WITH FREE AS (SELECT [index],
IsFree,
CASE WHEN [index] < @MAX THEN  [index] + 10000 ELSE [index] END as NotionalRow
FROM @TempTable)
UPDATE FREE SET IsFree = "false" WHERE NotionalRow>=@Max
AND NotionalRow < @Max+@Rows ;