2012-01-05 101 views
1

我需要在特定條件下從我的數據庫中刪除一堆行。我有select語句返回這個條件,然後對於這個select語句中的每一行,我需要它執行一個SP,它將刪除這些行和一些相關的行。到目前爲止,我有:使用選擇語句中返回的ID的循環SQL

select importfileid from import.importfiles where importfilestatusid < 7 

,然後執行

EXEC [import].[spDeleteFromAllImportRelatedTables] 
    @fileID = @importfileid 

我只是不知道如何做其間?如果有人能指出我會朝着正確的方向發展,那將是很棒的。

注:這是一次性的事情。性能不是問題。

回答

2

你可以使用光標:

declare @importFileID int 
declare @cur cursor 

set @cur = cursor fast_forward for 
select importfileid from import.importfiles where importfilestatusid < 7 

open @cur 
fetch next from @cur into @importFileID 
while(@@fetch_status = 0) 
begin 
    exec [import].[spDeleteFromAllImportRelatedTables] @fileID = @importFileID 
    fetch next from @cur into @importFileID 
end 
close @cur 
deallocate @cur 
+0

+1打我吧 – Curt 2012-01-05 10:47:11

+0

謝謝你這是完美的。我不知道遊標,並且可能會在每次刪除遊標時選擇它們。我將不得不閱讀這些內容。注意:'='不是'=='。 +1 – ediblecode 2012-01-05 10:49:48

+0

當然是'='而不是'==',我總是會忘記它,如果我短時間內不使用sql的話。) – Matten 2012-01-05 10:52:22

-1

我假設SP在做一些事情不僅僅是刪除行更爲特別。

如果這是一個一次性的事情可能你只是做喜歡的事,哈克:

SELECT 'EXEC [import].[spDeleteFromAllImportRelatedTables] @fileID =', importfileid from import.importfiles where importfilestatusid < 7 

然後複製和粘貼的結果和運行?

如果這是一個計劃清理,請考慮重新考慮您的代碼並編寫一個新的SP,它執行DeleteFromAllImportRelatedTables所做的操作,但使用上述條件。雖然可能有一些代碼重複,但它可能會使它更快更容易理解正在發生的事情,並且更容易進行調試,因爲您不會通過SP中的SP調用來查找任何問題。

0

我永遠不會建議使用遊標,而是去基於SET的方法。如果可能的話,您可以在所有相關表上使用連接來刪除所有這些行。這將是更快的方法。創建一個SP並創建一個在特定時間段爲您完成此任務的作業,生活將變得非常簡單。

+0

因爲op只是想要這樣做一次或不時,再說一次光標,因爲*快*並不重要...... – Matten 2012-01-05 10:50:28

+0

@Matten你是對的,但我只是分享我的觀點來解決問題。我應該用不同的方式說,不要冒犯。 – 2012-01-05 10:58:00

+0

我完全同意你的看法,基於集合的操作總是(數量級)比依靠t-sql中的程序編程更快。 – Matten 2012-01-05 10:59:45

0

你有幾個選項,其中沒有一個是漂亮的。

使用遊標

隨着(快進只讀遊標),您一次通過cn的搜索結果一個循環,並打電話給你的存儲過程。


支持臺

插入的所有記錄到一個表,然後記錄該存儲過程從表中讀取。

這可以是一個真正的表格或#temporary_table。

這樣做的好處是您可以一起完成所有的刪除操作,而不需要迭代循環。


封裝的第一步功能

如果你把你的SELECT代碼放到一個功能,可以重新對碼的SP調用該函數找到要刪除的記錄。然後SP的參數變成函數的參數。


在SQL Server 2008+中使用表參數對此進行了一些整理。但不是在SQL Server 2005中。

+0

'fast_forward'意味着'read_only'(和'forward_only') – Matten 2012-01-05 10:55:39