T-SQL存储过程@note变量插入异常:值写入前一条记录
问题分析与修复
错误原因
游标循环的插入逻辑中,当检测到新日期或科目组时,插入历史记录错误使用了当前记录的@note变量,而非存储历史组对应备注的@notef变量,导致前一条记录的note被替换为当前记录的内容。
修复后的存储过程代码
ALTER PROCEDURE [dbo].[orarioannuale] @idcorso int AS DECLARE @giorno varchar(50) DECLARE @giornosettimana varchar(50) DECLARE @nomemateria varchar(500) DECLARE @ora int DECLARE @docente varchar(500) DECLARE @note varchar(500) CREATE TABLE #result ( giorno varchar(50), giornosettimana varchar(50), nomemateria varchar(500), orada int, oraa int, docente varchar(500), note varchar (500) ) DECLARE @giornoold varchar(50) = '' DECLARE @giornosettimanaold varchar(50) = '' DECLARE @docenteold varchar(500) = '' DECLARE @materiaold varchar(500) = '' DECLARE @orain int DECLARE @orafin int DECLARE @oreg int DECLARE @notef varchar(500) DECLARE vendor_cursor CURSOR FOR SELECT '''' + CONVERT(varchar, DATEPART(DAY, [giorno])) + '/' + CONVERT(varchar, DATEPART(MONTH, [giorno])) + '/' + CONVERT(varchar, DATEPART(YEAR, [giorno])) giornoo, CASE WHEN [giornosettimana] = 1 THEN 'LUNEDI''' WHEN [giornosettimana] = 2 THEN 'MARTEDI''' WHEN [giornosettimana] = 3 THEN 'MERCOLEDI''' WHEN [giornosettimana] = 4 THEN 'GIOVEDI''' WHEN [giornosettimana] = 5 THEN 'VENERDI''' WHEN [giornosettimana] = 6 THEN 'SABATO''' END giornosettimana, NomeMateria, ora, REPLACE([Cognome], 'A-', '') docente, note FROM [dbo].[calendario] WHERE idcorso = @idcorso --2204--2192 ORDER BY giorno, ora OPEN vendor_cursor FETCH NEXT FROM vendor_cursor INTO @giorno, @giornosettimana, @nomemateria, @ora, @docente, @note WHILE @@FETCH_STATUS = 0 BEGIN IF @materiaold = '' BEGIN SET @giornoold = @giorno SET @giornosettimanaold = @giornosettimana SET @docenteold = @docente SET @materiaold = @nomemateria SET @orain = @ora SET @oreg = 0 SET @notef = @note END IF (@giorno <> @giornoold OR @nomemateria <> @materiaold) BEGIN -- 修复:使用@notef插入历史组的正确备注 INSERT INTO #result VALUES (@giornoold, @giornosettimanaold, @materiaold, @orain, @orain + @oreg, @docenteold, @notef) SET @giornoold = @giorno SET @giornosettimanaold = @giornosettimana SET @docenteold = @docente SET @materiaold = @nomemateria SET @orain = @ora SET @oreg = 1 SET @notef = @note END ELSE SET @oreg = @oreg + 1 FETCH NEXT FROM vendor_cursor INTO @giorno, @giornosettimana, @nomemateria, @ora, @docente, @note END CLOSE vendor_cursor; DEALLOCATE vendor_cursor; INSERT INTO #result VALUES (@giornoold, @giornosettimanaold, @materiaold, @orain, @orain + @oreg, @docenteold, @notef) SELECT giorno, giornosettimana, nomemateria, '''' + CONVERT(VARCHAR, (orada)) + '-' + CONVERT(VARCHAR, (oraa)) AS orario, oraa-orada AS numeroore, docente, note FROM #result
关键修复说明
- 循环内的
INSERT INTO #result语句中,将最后一个参数从@note替换为@notef。 @notef专门存储当前累积组的备注信息,切换新组时它保存的是上一组的正确备注;而@note是刚获取的新组备注,不能用于插入上一组记录。
内容的提问来源于stack exchange,提问作者Persinox
相关产品推荐
相关产品推荐

