Хоча Loop Issue - sql, sql-server, tsql

Сподіваючись, що хтось може допомогти, я зараз працюю над кодом, який, здається, має проблеми. На жаль, я не можу розмістити основні дані, але спробую пояснити.

Код в даний час циклів через вибірkpi "s і обчислює, чи потрібно щось виконувати або не засноване на поточному часі, і чи потрібно виконувати окремі kpi". На даний момент, якщо я жорсткий код число kpi "з кодом працює нормально, але якщо я дозволю це циклу через всі Kpi" S, ті, які не повинні працювати, сказали, щоб запустити, а також у виборі, який визначає речі, як @ \ t Період, коли я дозволяю йому працювати через всі КПІ "його налаштування @ Період неправильно, коли він не повинен працювати, але коли його призначено для запуску його встановити його штраф.

В цілому у мене є 2 питання, які, на мою думку, пов'язаніКПІ виконується, коли вони не призначені, і коли вони працюють, коли вони не призначені для того, щоб вони забрали неправильний Період у будь-якому випадку, що незвичайно. 's стають змішані, але я не можу побачити, як це відбувається, будь-яка допомога буде великим, перш ніж я зійде з розуму.

Як ви можете бачити з мого коду є 2 @current_timestamps, коли його встановлено в 23.45.18.873 він не повинен запускати деякі з kpi ", але він запускає їх все одно і 21.45.18.873 означає, що вони можуть працювати.

declare @job_current_time_minute float,
@job_current_date_time_minute as datetime,
@current_timestamp as datetime



SET @job_current_time_minute = 52--cast(datepart(minute, getdate()) as float)
SET @job_current_date_time_minute =  getdate()
--SET @current_timestamp = cast("2017-04-02 23:45:18.873" as datetime)
SET @current_timestamp = cast("2017-04-02 21:45:18.873" as datetime)
--Run: 88 6 0 52 5 5 5
--Run: 88 1 10 52 5 5 5

declare
@kpi_id int,
@kpi_parent_id int,
@sql nvarchar(max),
@kpi_last_result nvarchar(100),
@kpi_last_runtime datetime,
@kpi_params nvarchar(max),
@kpi_current_time_minute float,
@schedulue_minute float,
@reoccurrence float,
@result float,
@kpi2 int,

-- Email Variables
@kpi_name nvarchar(150),
@kpi_desc nvarchar(150),
@kpi_report_link nvarchar(150),
@kpi_email_subject nvarchar(150),
@kpi_email_body nvarchar(300),
@kpi_email_query nvarchar(max),
@kpi_sms_msg nvarchar(300);


SET @kpi_params = N"@retvalOUT varchar(max) OUTPUT";

select @kpi_id = min(kpi_id) from KPI where KPI_Active = 1; --and kpi_id in (86, 88)

while @kpi_id is not null

begin

select
@kpi_parent_id = kpi_parent_id,
@sql = kpi_Script,
@schedulue_minute = datepart(minute,s.Schedule_Start),
@reoccurrence = s.Reoccurrence,
@result = cast((@job_current_time_minute - datepart(minute,s.Schedule_Start)) / s.Reoccurrence as decimal(18,2)),
@kpi_name = kpi_name,
@kpi_desc = kpi_desc,
@kpi_report_link = kpi_report_link,
@kpi_email_subject = kpi_email_subject,
@kpi_email_body = kpi_email_body,
@kpi_email_query = kpi_email_query,
@kpi_sms_msg = kpi_sms_msg,
@kpi_current_time_minute = 60*DATEPART(HOUR, GETDATE())+DATEPART(MINUTE,GETDATE()),
@kpi2 = KPI_ID
from EWI..KPI
inner join EWI..Schedule s on KPI.Schedule_ID = s.Schedule_ID where kpi_id = @kpi_id--order by kpi_id asc

--set @sql = "select @retvalOUT= (" + @sql + ")"

if floor(@result) <> ceiling(@result)

begin

PRINT "Not Time to Run: " + " " + cast(@kpi_id as varchar(11)) + " " + cast(@result as varchar(11))

end

else

begin

declare
@ThresholdID int,
@PeriodID int,
@Threshold_value int,
@Threshold_PosNeg nvarchar(5)

select @ThresholdID = Threshold_ID, @PeriodID = Period_ID, @Threshold_value = Threshold_value, @Threshold_PosNeg = Threshold_PosNeg from (
--  select * from (
select * from (
select KPI_ID, t.Threshold_ID, p.Period_ID, t.Threshold_Value, t.Threshold_PosNeg, p.DayStartTime, p.DayEndTime, Period_desc, [Day]
from EWI..Threshold t join
EWI..Period p on t.Period_ID = p.Period_ID where KPI_ID = @kpi_id
) x where (case when [Day] = datename(dw,getdate()) then Period_id
when [Day] = choose(datepart(dw, getdate()), "WEEKEND","Weekday","Weekday","Weekday","Weekday","Weekday","WEEKEND") then Period_ID
when [Day] = "All" then Period_ID end) is not null
) y where case when datediff(second,DayStartTime,DayEndTime) > 0 then
case when convert(time(0), @current_timestamp) >= DayStartTime and convert(time(0), @current_timestamp) < DayEndTime then 1 else 0 end
else case when convert(time(0), @current_timestamp) >= DayStartTime or convert(time(0), @current_timestamp) < DayEndTime then 1 else 0 end
end = 1


select "Run: " + cast(@kpi_id as varchar(11)) + " " + cast(@PeriodID as varchar(11)) + " " +
cast(@Threshold_value as varchar(11)) + " " + cast(@job_current_time_minute as varchar(11))  + " " +
cast(@result as varchar(11))  + " " +
cast(ceiling(@result) as varchar(11))+ " " +cast(floor(@result) as varchar(11))

end


select @kpi_id = min(kpi_id) from KPI where KPI_Active = 1 and kpi_id > @kpi_id;


end

Відповіді:

1 для відповіді № 1

Погляньте на це демонстрація rextester. Чи згодні ви, що ця модель відтворює проблему? Здається, що порівнюють ceiling(@result) до floor(@result) дійсно дадуть скрізь true.

Після нашого обговорення мені здається, що тест повинен бути: if (@result - datepart(minute, Schedule_Start)) % @reoccurrence = 0 або щось подібне. Але це припускає @reoccurence буде цілим числом.