存盤程序“@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(50)=''
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
insert into #result values (@giornoold,@giornosettimanaold,@materiaold,@orain,@orain @oreg,@docenteold,@note)
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
請記住,我要解決的問題是:此存盤程序中最后宣告的變數被列印/插入到以前的記錄中。
很抱歉在這里問這個問題,但我真的不知道這是為什么。
這是我從創建的表中需要的
問題圖片解釋成表
uj5u.com熱心網友回復:
嘗試更改第一個插入
insert into #result values (...,@note)
至:
insert into #result values (...,@notef)
在邏輯的這一點上,您已經檢測到giornoor之一發生了變化,nomemateria并且正在嘗試從先前的記錄中寫入保存的“舊”資料。保存的舊@notef值是您想要的,而不是@note.
附錄:
您還可以完全消除游標回圈,方法是使用ROW_NUMBER() OVER(PARTITION BY ... ORDER BY ...) 排名視窗功能在每個組中分配序列號,然后在將所選資料自定義為最終結果之前從每個組中選擇最新的。
有關類似問題的案例,請參閱此問題。
您可以從以下內容開始:
SELECT *
FROM (
SELECT
ROW_NUMBER() OVER(PARTITION BY giorno, giornosettimana ORDER BY ora DESC) AS RowNumInPartitonDescending,
ROW_NUMBER() OVER(PARTITION BY giorno, giornosettimana ORDER BY ora) AS RowNumInPartitonAscending, -- oreg
*
FROM [dbo].[calendario]
WHERE idcorso = @idcorso --2204--2192
) A
WHERE RowNumInPartitonDescending = 1 -- Selects the latest from each partition
ORDER BY giorno, ora
確認行選擇邏輯后,您可以將其替換為SELECT *自定義結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/514571.html
