You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:32:08