使用非标识列SQL在表中迭代每条记录

时间:2015-12-02 08:06:43

标签: sql sql-server tsql

我需要在Table中迭代每条记录,并使用record循环将variable值分配给while。该表格没有Identitysequence列。我知道我们可以使用temp tabletable dataidentity column创建Rownumber并将其用于每个记录迭代。是否有其他方法可以为每个rownumber选择implicitly特定记录row

2 个答案:

答案 0 :(得分:2)

这应该可以胜任。在光标内部,您可以使用变量做任何您喜欢的事情,我只是将它们传递给了一个过程。

DECLARE @office_id AS int, @row_number AS INT
DECLARE c CURSOR
FOR
    SELECT  office_id, ROW_NUMBER() OVER (PARTITION BY office_id order BY office_id) 
    FROM    my_office_table
    WHERE   offices_to_budget_for = 'Y'

OPEN c 
FETCH NEXT FROM c INTO @office_id
WHILE @@FETCH_STATUS = 0
BEGIN

    EXEC dbo.do_budget_for_office @office_id, @row_number

    FETCH NEXT FROM c INTO @office_id, @row_number
END
CLOSE c
DEALLOCATE c

我真的不推荐日常使用的游标,但它们是一种工具并且有它们的位置。

编辑:

SELECT  office_id, ROW_NUMBER() OVER (PARTITION BY office_id order BY office_id) as rowNum
into  #TempOffices
FROM    my_office_table
WHERE   offices_to_budget_for = 'Y'

While (Select Count(*) From #TempOffices) > 0
Begin

    Select Top 1 @office_id = office_id, @row_number = rowNumFrom #Temp

    --Do some processing here

    Delete #Temp Where Id = @Id and rowNum = @row_number

End

drop #tempOffices

不使用光标,你并没有真正获得任何东西。它专为此类操作而设计。

同样,游标或while循环都不应该经常在sql中使用。它就像NOLOCK。它是一个工具。使用不当会造成很多伤害。正确使用并在适当的情况下,他们是一个救生员。

答案 1 :(得分:1)

load()语句中使用窗口函数ROW_NUMBER。它为查询中返回的每一行提供唯一编号。

https://msdn.microsoft.com/en-us/library/ms186734.aspx