在游标循环中定义变量,与外面定义变量有何不同,如下代码所示:
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.在变量外部声明一个变量,然后在循环内先设置一个默认值,再根据业务需要进行复制(推荐,易读不容易出错)。
标签:定义,temp,游标,循环,CR,DECLARE,变量 From: https://www.cnblogs.com/jizhong/p/17922138.html