[英]SQL Server 2012: am I missing something when working with an If-Else if-Else block?
總的來說,我試圖查看審核表,看看是否已經處理了特定的日期范圍。 在這種特定情況下, @fstartrangedate
將為NULL,因為尚未找到2016-11-01
開始日期。 這應該是主要的其他條件。 @superceded
應設置為0, @type
(sumtype)應設置為WEEKLY, @days
應設置為7。
我做到了正確的主要條件。 甚至將它設置為Weekly - 然而,某種程度上@type被設置為SPECIAL。
有人可以看看@this。 我可能做了一些非常愚蠢的事,但我只是沒有看到它。
這是代碼:
-- determine if this is a daily, weekly, monthly or special run
declare @superceded bit
declare @type varchar(50)
declare @foundSameStartDate bit
declare @days int
declare @vdays int
declare @fLoadId int
-- incoming parameters
declare @startrangedate date
declare @endrangedate date
-- found startdate
declare @fstartrangedate date
--debug
select @fstartrangedate as fstartrangedate
-- validation test --
declare @vstartrangedate date
declare @vendrangedate date
set @startrangedate = cast('2016-11-01' as date);
-- debug
select @startrangedate as startrangedate
set @endrangedate = cast('2016-11-08' as date);
select
@fstartrangedate = StartRangeDateTime,
@fLoadId = LoadId
from
FleetMatching.Audit_LoadTracker
where
StartRangeDateTime IN (select StartRangeDateTime
from FleetMatching.Audit_LoadTracker
where IsSuperceded = 0
and IsLoadCompleted = 1
and StartRangeDateTime = @startrangedate)
-- debug
select @fstartrangedate as fstartrangedate
IF(@fstartrangedate is not null)
BEGIN
print 'found start date does = startdate'
-- valid start/end dates for a full month
select @vstartrangedate = dateadd(month, datediff(month, 0, @startrangedate), 0)
select @vendrangedate = dateadd(day, -1, dateadd(month, datediff(month, -1, @startrangedate), 0))
select @days = datediff(day, @startrangedate, @endrangedate)
select @vdays = datediff(day, @vstartrangedate, @vendrangedate)
-- we found an existing range which will be superseded by this
-- execution/load
set @superceded = 1
-- debug
select @days as [Days]
select @type as SumType
if(@days = 1)
set @type = 'DAILY'
else if(@days = 7)
set @type = 'WEEKLY'
else if((@days >= 27) AND (@days <= 31))
set @type = 'MONTHLY'
else
print 'found condition-special'
set @type = 'SPECIAL'
END
ELSE
Begin
print 'Reached MAIN-IF Else Condition'
print 'found start date does NOT .eq. startdate'
set @superceded = 0
select @days = datediff(day,@startrangedate,@endrangedate)
-- debug
select @days as [Days]
select @type as SumType
if(@days = 0)
begin
print 'daily as 0'
set @type = 'DAILY'
end
else if(@days = 7)
begin
print 'weekly as 7';
set @type = 'WEEKLY';
end
else if(@days >= 28 AND @days <= 31)
begin
print 'monthly as 28->31'
set @type = 'MONTHLY'
end
else
print 'else condition=special'
set @type = 'SPECIAL'
END
-- DEBUG
select @superceded as IsSuperceded
select @type as SumType
以下是執行時的調試輸出消息:
(1 row(s) affected)
(1 row(s) affected)
(1 row(s) affected)
Reached MAIN-IF Else Condition
found start date does NOT .eq. startdate
(1 row(s) affected)
(1 row(s) affected)
weekly as 7
(1 row(s) affected)
(1 row(s) affected)*
以下是執行時的變量輸出消息:
讓我向您介紹我的好友case
!
set @type = case
when @days = 0 then 'Daily'
when @days = 7 then 'Weekly'
when @days >=28 and @days <= 31 then 'Monthly'
else 'Special'
end;
if (@days = 0) begin print 'daily as 0' set @type = 'DAILY' end else if (@days = 7) begin print 'weekly as 7'; set @type = 'WEEKLY'; end else if (@days >= 28 and @days <= 31) begin print 'monthly as 28->31' set @type = 'MONTHLY' end else print 'else condition=special' /* < ----- without begin and end, else stops after the print and the following `set` is outside of the flow control */ set @type = 'SPECIAL'
具有諷刺意味的是,如果您沒有使用這些print語句調試代碼,那么您就不會遇到(發現?)錯誤。
rextester演示以顯示錯誤,以及begin/end
將如何修復它: http ://rextester.com/CSUM92647
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.