2014-06-25 60 views
-2

我不允许使用游标或临时表。我只能使用while循环。使用while循环获取下一条记录

表1 - 只读表(不可编辑)

id name 

M01 Raja 
M02 Ravi 
M03 Vijay 
M04 suresh 

查询

Declare @TotRecord int, @CurrRecord Int, @id varchar(10) 

Select @TotRec = COUNT(*) from Table1 
Set @CurrRec = 1 
WHILE (@CurrRec <[email protected]) 
BEGIN 

--*Here i want to get the id from table, 
--next time i need to get second id. 
--next time i need to get third id. 
--.... 

--1st time i can get the top 1 id by using this below query 
Select top 1 @id = id from table 
--Next time i want to get second id.* 


SET @CurrRec = @CurrRec + 1 
END 
+1

表变量呢? – Paolo

回答

-1
Select id,name,row_number() over (order by id) 'Row' into #temp 
from table 

Select @id = id from #temp where row = @current 

使用临时表来获取下一个ID

+0

这是行不通的... – Azar

+0

他说他不想使用临时表或游标:D –

0

使用

SELECT TOP 1 * FROM table WHERE id > @iterator ORDER BY id ASC 
模式

在一个循环

0

如果ID是序列号(M01,M02,M03,...),那么您可以在使用下列与while循环

SELECT TOP 1 @id = id FROM table WHERE CAST(REPLACE(id,'M','') AS INT) = @CurrRecord 

完整的查询

DECLARE @TotRecord INT, @CurrRecord INT, @id VARCHAR(10) 

SELECT @TotRecord = COUNT(*) FROM Table1 
SET @CurrRecord = 1 
WHILE @CurrRecord <= @TotRecord 
BEGIN 
    -- Get ID 
    SELECT TOP 1 @id = id FROM Table1 WHERE CAST(REPLACE(id,'M','') AS INT) = @CurrRecord 

    -- Do something 

    SET @CurrRecord = @CurrRecord + 1 
END 
0

您可以使用光标一对一地获取您的查询记录。

例如:

Declare @Col1 INT, 
     @Col2 INT, 
     ... 


DECLARE X CURSOR FOR 
SELECT Col1, col2 , ... 
FROM YourTableName 


OPEN X 
FETCH NEXT FROM X INTO @Col1, @Col2, ... 
WHILE @@FETCH_STATUS=0 BEGIN 
    --your code to do with columns data of your record 
    FETCH NEXT FROM X INTO @Col1, @Col2, ... 
END 
CLOSE X 
DEALLOCATE X 

您还可以使用其中对于你的想法:

DECLARE @Id INT, 
     @OldId INT, 
     @Col1 INT, 
     @Col2 INT 
     ... 

WHILE 1=1 BEGIN 

    SET @OldId = @Id 
    SET @Id = NULL 

    SELECT TOP 1 @Id = Id, 
       @Col1 = Column1, 
       @Col2 = Column2 
    FROM YourTable 
    WHERE (@OldId IS NULL OR Id > @OldId) ORDER BY Id 

    IF @Id IS NULL BREAK 

    -- your Code Here 
END 
0
DECLARE @TotRecord INT; 
DECLARE @CurrRecord INT; 
DECLARE @id VARCHAR(10); 

SELECT @TotRecord = COUNT(*) from Table1; 
SELECT @CurrRecord = 1; 
SELECT TOP 1 @id = id FROM Table1 ORDER BY id; 
WHILE (@CurrRecord <= @TotRecord) 
BEGIN 
    --Do something... 
    --Get the next id 
    SELECT TOP 1 @id = id FROM Table1 WHERE id > @id ORDER BY id; 
    SELECT @CurrRecord = @CurrRecord + 1; 
END; 

但要注意的是,如果该ID是在表1的独特,这只会工作。

+0

'id'是一个VARCHAR字段 – Jesuraja

+0

@Jesuraja肯定有一些创意解析和铸造会做这项工作 – Akash

+0

即使id是一个VARCHAR字段,只要它是唯一的,它并不重要。是的,您不会按照您预期的顺序获取数据,但您将只处理一行一次的每一行......如果订单很重要,那么您可以先通过删除“M”来解析它。 –

0
Declare @TotRecord int, @CurrRecord Int, @id varchar(10) 

    Select @TotRec = COUNT(*) from Table1 
    Set @CurrRec = 1 
    WHILE (@CurrRec <[email protected]) 
    BEGIN 

    select LAST(id) from (SELECT TOP @CurrRec id 
    FROM Table1); 

    //Here you will get the last record, i havent tried this, but iam sure about the logic , hope this one helps 

    SET @CurrRec = @CurrRec + 1 
    END