簡體   English   中英

遍歷具有“非標識”列的表中的每條記錄SQL

[英]Iterate through Each Record In a Table with Non-identity column SQL

我需要遍歷Table每個記錄,並使用while循環將該record值分配給variable 該表沒有任何“ Identity或“ sequence列。 我知道我們可以使用table dataidentity columnRownumber創建一個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 它為查詢中返回的每一行提供唯一的編號。

https://msdn.microsoft.com/zh-CN/library/ms186734.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM