[英]Iterate through Each Record In a Table with Non-identity column SQL
我需要遍歷Table
每個記錄,並使用while
循環將該record
值分配給variable
。 該表沒有任何“ Identity
或“ sequence
列。 我知道我們可以使用table data
和identity column
或Rownumber
創建一個temp table
,並將其用於每次記錄迭代。 有沒有解決任何其他方式來選擇rownumber
特定記錄implicitly
為每個row
?
這應該做的工作。 在游標中,您可以對變量執行任何操作,我剛剛將它們傳遞給proc。
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。 它是一個工具。 錯誤使用會造成很多損壞。 在正確的情況下正確使用它們可以挽救生命。
在SELECT
語句中使用窗口函數ROW_NUMBER
。 它為查詢中返回的每一行提供唯一的編號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.