2012-07-02 73 views
-1

我有一個遊標,我想通過一個臨時表循環,並將每個記錄合併到另一個表中。光標沒有正確循環

我不能得到這個遊標只是爲了遍歷記錄並返回一個計數。

DECLARE @curCatalogID int 
DECLARE @curNomenclature varchar(200) 
DECLARE @curMainCategory varchar(200) 
DECLARE @curSubCategory varchar(200) 
DECLARE @curManufacturer varchar(200) 
DECLARE @curModelNo varchar(200) 
DECLARE @curPrice varchar(200) 
DECLARE @curProductDesc varchar(2000) 
DECLARE @curImage varchar(200) 
DECLARE @curPDFName varchar(200) 
DECLARE @curInventory varchar(200) 
DECLARE @curBatchID int 
DECLARE @curAuditID int 

DECLARE @nCnt int 
SET @nCnt = 0 

DECLARE import_loop CURSOR FOR 
SELECT * FROM tblCatalogStaging 

OPEN import_loop 
FETCH NEXT FROM import_loop 
INTO @curCatalogID, 
     @curNomenclature, 
     @curMainCategory, 
     @curSubCategory, 
     @curManufacturer, 
     @curModelNo, 
     @curPrice, 
     @curProductDesc, 
     @curImage, 
     @curPDFName, 
     @curInventory, 
     @curBatchID, 
     @curAuditID 

WHILE @@FETCH_STATUS = 0 
BEGIN 

SET @nCnt = @@ROWCOUNT; 

     FETCH NEXT FROM import_loop 
     INTO @curCatalogID, 
     @curNomenclature, 
     @curMainCategory, 
     @curSubCategory, 
     @curManufacturer, 
     @curModelNo, 
     @curPrice, 
     @curProductDesc, 
     @curImage, 
     @curPDFName, 
     @curInventory, 
     @curBatchID, 
     @curAuditID 

END 
CLOSE import_loop 
DEALLOCATE import_loop 

SELECT @nCnt 

它應該只是返回的2036值爲1,但即時通訊(在臨時表中的行數)又回到像2036行受到影響,受影響的4072行,等等等等

+2

如果你說'SQL'但真的意味着Microsoft ** SQL Server **那麼 - 爲什麼地球上你用*遊標*做這個?遊標是不好的,遊標是邪惡的,遊標是** RBAR **(逐行排列)並且幾乎沒有真正需要......你使用的是什麼**版本的SQL Server?查看例如MERGE'語句(在SQL Server ** 2008或更新的版本上可用) –

+0

您不應該像SQL中的C#或VB.NET那樣執行**順序處理** - 您應該[學會用**思考**設置**並使用基於集合的操作](http://www.simple-talk.com/sql/database-administration/the-road-to-professional-database-development-set-based-thinking/)而不是遊標...... –

+0

我需要在數據合併時生成異常......我如何訪問合併語句中的每一行? – user1236803

回答

1

我不那麼肯定@@ ROWCOUNT是指CURSOR內使用。

你可能有更好的運氣:

DECLARE @nCnt INT 
SET @nCnt = 0 
... 
SET @nCnt = @nCnt + 1; 

注:TRIGGER可能是正確的地方做對行的插入/更新此驗證。除非你真的只希望驗證有時會發生。 (另外,它會導致SQL錯誤,而不是例外)

0

林不知道,如果它的那樣簡單因爲這可是你只是想:

select count (*) FROM tblCatalogStaging 
+0

不,我要把合併放到這裏遊標,並將檢查遊標中的值。 – user1236803

0

@@Rowcount提供了最後一個要執行的狀態網絡所影響的行數。我不認爲這是你想要的,我會同意ebyrob關於使用計數器變量。

但是,這是如果你真的需要在遊標中做到這一點。 AS marc_s建議,您可能希望重寫您的實際過程,以便使用集合。如果這是不可能的,並且您需要(如您在回覆中所述)處理循環中的異常情況,則可能需要查看Phil Factors最近關於該topic的文章。