Mam tabelę z numerami od 1000 do 9999.
DECLARE @TempTable Table(index int,IsFree bit)
DECLARE @Max int,@Rows int
SET @Max=0
The IsFree
ustawione na true.
Pierwszego dnia użytkownik może wybrać liczbę wierszy, na przykład 300, Pierwsze 300 z przedziału od 1 do 300 będzie miało wartość false, a użytkownik otrzyma wszystkie wiersze z przedziału 301-9999.
UPDATE @TempTable
SET IsFree=0
WHERE index>=@Max
AND index < @Max+@Rows
W drugim dniu użytkownik może wybrać 400, więc chcę, aby wiersze od 301 do 700 miały wartość false, a użytkownik otrzyma wiersze od 701 do 9999.
SELECT TOP 1 @Max=index
FROM @TempTable
WHERE IsFree=0
ORDER BY index
pierwsze 300 może obstawić ustawione na wartość true, ale nie jest to konieczne.
Chodzi mi o to, że każdego dnia maksymalny indeks wiersza, który ma wartość true + 1, będzie pierwszym wierszem do aktualizacji false + liczba wierszy wybranych przez użytkownika.
Mój problem zaczyna się, gdy docieram do końcatabela, na przykład maksymalny indeks wiersza z wartością true to 9990, a użytkownik wybierze 100, wiersz 9991-9999 powinien mieć wartość false, a wszystkie wiersze, które mają wartość true od 1 do 90, zostaną ustawione na false. Problem w tym, jak ustawić następny dzień, jak znaleźć wiersz 91 jest pierwszym wierszem do aktualizacji?
Odpowiedzi:
0 dla odpowiedzi № 1kiedy indeks znajduje się „za” początkiem, możesz użyć „indeksu hipotetycznego”, jeśli indeks + 10000, aby ustawić go na końcu sekwencji
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 ;