我需要在Table
中迭代每条记录,并使用record
循环将variable
值分配给while
。该表格没有Identity
或sequence
列。我知道我们可以使用temp table
和table data
或identity column
创建Rownumber
并将其用于每个记录迭代。是否有其他方法可以为每个rownumber
选择implicitly
特定记录row
?
答案 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
。它为查询中返回的每一行提供唯一编号。