游标循环中定义变量

发布时间 2023-12-22 18:12:43作者: Shapley

在游标循环中定义变量,与外面定义变量有何不同,如下代码所示:

CREATE TABLE #temp (NAME VARCHAR(50));
INSERT INTO #temp VALUES ('1');
INSERT INTO #temp VALUES ('2');

DECLARE @i INT = 1;

DECLARE @djbh VARCHAR(50);
DECLARE A_CR CURSOR FORWARD_ONLY FOR SELECT NAME FROM #temp;
OPEN A_CR;
FETCH NEXT FROM A_CR
INTO @djbh;
WHILE @@fetch_status = 0
    BEGIN
        DECLARE @newremark VARCHAR(500);
        IF (@i = 1)
            BEGIN
                SET @newremark = 'ddddddd';
            END;
        SELECT @newremark;
        SET @i = @i + 1;
        FETCH NEXT FROM A_CR
        INTO @djbh;
    END;
--关闭游标
CLOSE A_CR;
DEALLOCATE A_CR;

设想:由于是在游标循环中定义的变量,每次循环都会声明一个新的变量,因此本人感觉结果应该为:

dddddddd/NULL,但是实际却生成了两行ddddddddd.如下所示:

此结果的产生,只能解释为:在游标循环内部声明变量(没有默认值的情况下),那么跟在外面声明变量的效果是一样的。

结论:

若想要生成符合预期的结果,两种改造方法:

1.在循环内部定义变量时设置一个默认值,如:@a varchar(50)='',

2.在变量外部声明一个变量,然后在循环内先设置一个默认值,再根据业务需要进行复制(推荐,易读不容易出错)。