2012-07-02 76 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的文章。