既然你沒有給我們你的情況充分說明,我們無法給出一個完整的答案,但是,在一般情況下,它的循環要避免在基於集合的語言如SQL而不是遊標本身(與Cursosr的問題是它們需要循環)。
在你的評論中,你提供了一點信息,你想要「循環遍歷第一張表,比較第二張表,當比較失敗時,我刪除第一張表的記錄。本質上,我刪除了recods從員工誰是不再與該公司的第一個表「
這裏是你如何在SQL這樣做:
DELETE From FirstTable
WHERE FirstTable.EmployeeID NOT IN
(
SELECT SecondTable.EmployeeID
FROM SecondTable
WHERE SecondTable.Flag = 'Y'
)
需要沒有循環...
如果問題則是要使用預先現有的存儲過程做刪除,再就是幾個可能性:
首先,你可以提取存儲過程的內容,並重新寫入他們爲這些前面的WHERE條件。我知道這是代碼重複,它違反了一些人的DRY本能,但是,要理解SQL是而不是面向對象的開發環境,有時候代碼重複必須發生。
第二種選擇是重構存儲過程,以便它可以接受一個TableParameter來爲其EmployeeId的Delete。雖然這很複雜,但我們需要查看該存儲過程以便爲其提供建議。
第三種選擇是使用字符串聚集來構建動態SQL調用存儲過程的每個僱員將被刪除,像這樣:
DECLARE @sql As NVarchar(MAX);
SET @sql = N'';
SELECT @sql = @sql + '
EXEC YourProc ''' + CAST(EmployeeID As NVARCHAR(MAX)) + '''; '
FROM FirstTable
WHERE FirstTable.EmployeeID IN
(
SELECT SecondTable.EmployeeID
FROM SecondTable
WHERE SecondTable.Flag = 'Y'
)
EXEC(@sql);
這樣就避免了兩成環和Cusror問題,雖然許多也不喜歡它。我更喜歡這個解決方案,主要是因爲它的一般性。
難道你們就不能使用加入? –
不,我循環第一個表,比較第二個表,當比較失敗時,我從第一個表中刪除記錄。本質上,我正在刪除第一個不在公司的員工表中的recod。 –
你從該行傳遞給存儲過程的數據是什麼? – podiluska