获取X和Y之间的自由数字列表

时间:2016-11-03 14:30:00

标签: sql-server tsql

我有一张数字在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行是第一行更新?

1 个答案:

答案 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 ;