我有一张数字在1000到9999之间的表格。
DECLARE @TempTable Table(index int,IsFree bit)
DECLARE @Max int,@Rows int
SET @Max=0
IsFree
设置为true。
在第1天,用户可以选择行数,例如300, 从1到300的前300将设置为false,用户将获得301-9999之间的所有行。
UPDATE @TempTable
SET IsFree=0
WHERE index>=@Max
AND index < @Max+@Rows
在第2天,用户可以选择400,所以我希望将行301到700设置为false,用户将获得701到9999行。
SELECT TOP 1 @Max=index
FROM @TempTable
WHERE IsFree=0
ORDER BY index
前300可以设置为true但不是必需的。
我的意思是每天最大行索引的值为true + 1,将是第一行更新false +用户选择的行数。
当我到达表的末尾时,我的问题就开始了,例如,带有true的最大行索引是9990,用户选择100,行9991-9999应该设置为false,所有行的值从1开始为true到90将设置为false。问题是如何设置第二天,如何找到第91行是第一行更新?
答案 0 :(得分:0)
当指数落后&#39;一开始,你可以使用一个名义指数&#39; if index + 10000命令它跟随序列的结尾
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 ;