簡體   English   中英

SQL Server 2012:我在使用If-Else if-Else塊時遺漏了什么?

[英]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)*

以下是執行時的變量輸出消息:

ssms_output

讓我向您介紹我的好友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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM