光标无法正确循环

时间:2012-07-02 19:30:34

标签: sql-server cursor

我有一个游标,我想循环通过一个临时表,并将每个记录合并到另一个表。

我不能让这个光标只是循环记录并返回一个计数。

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

它应该只返回1的值2036(登台表中的行数),但我会回复受影响的2036行,受影响的4072行等等

3 个答案:

答案 0 :(得分:2)

我不太确定@@ ROWCOUNT是否可以在CURSOR中使用。

你可能会有更好的运气:

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

注意:TRIGGER可能是在行插入/更新上进行此验证的正确位置。除非你真的只想要有时进行验证。 (另外,它会引发SQL错误,而不是异常)

答案 1 :(得分:0)

我不确定它是否像这样简单,但你只是想要:

select count (*) FROM tblCatalogStaging

答案 2 :(得分:0)

@@Rowcount提供受上一个要执行的statemenet影响的行数。我不认为这是你想要的,我同意ebyrob关于使用计数器变量。

但是,如果你真的需要在游标中执行此操作。 AS marc_s建议,你可能想要重新设计你的实际程序,以便它使用集合。如果这是不可能的,并且您需要,正如您在回复中所述,处理循环中的异常,您可能需要查看Phil Factors最近关于topic的文章。