2015-12-16 2 views
0

У меня есть хранимая процедура, как это:Очевидно, что хранимая процедура SQL?

IF @Active=0 
    select @rowCount=(select count(1) from [table] WHERE (GETDATE() BETWEEN StartTime AND EndTime) AND [email protected] 

IF @Active=1 
    select @rowCount=(select count(1) from [table] WHERE NOT(GETDATE() BETWEEN StartTime AND EndTime) AND [email protected] 

Есть ли способ, чтобы сделать заявление более ясно?

Я делаю пагинация так:

Параметры:

@pageNum AS BIGINT, 
@pageSize AS BIGINT, 
@Active AS INT, 
@RowCount AS INT OUTPUT 

И отдых:

IF @Active=0 
BEGIN 
    WITH K AS 
    ( - SELECT [Id] 
     FROM [table] 
     WHERE not(GETDATE() BETWEEN StartTime AND EndTime) AND [email protected] ORDER BY [Id] 
     OFFSET (@pagenum - 1) * @pagesize ROWS FETCH NEXT @pagesize ROWS ONLY 
    ) 
    SELECT T.[Id],T.[Name] 
    FROM [table] 
    AS T 
     INNER JOIN K 
     ON T.Id = K.Id 

    ORDER BY T.Id; 

    select @rowCount=(select count(1) from [table] WHERE not(GETDATE() BETWEEN StartTime AND EndTime) AND [email protected] 
END 
IF @Active=1 
BEGIN 
    WITH K AS 
    ( 
     SELECT [Id] 
     FROM [table] 
     WHERE (GETDATE() BETWEEN StartTime AND EndTime) AND [email protected] 
     ORDER BY [Id] 
     OFFSET (@pagenum - 1) * @pagesize ROWS FETCH NEXT @pagesize ROWS ONLY 
    ) 
    SELECT T.[Id],T.[Name] 
    FROM [table] 
    AS F 
     INNER JOIN K 
     ON T.Id = K.Id 

    ORDER BY T.Id; 

    select @rowCount=(select count(1) from [table] WHERE (GETDATE() BETWEEN StartTime AND EndTime) AND [email protected] END 

и хранимая процедура выглядит очень долго ..... так Мне интересно, есть ли лучший способ сделать это лучше

+0

два возможных отсчетов исчерпывающих - т.е. это означало быть, что, если вы звоните в этот раз с '@ Active' установлен в 0 и снова с ним установлен в 1, и вместе они объединяют результаты, если сумма этих двух результатов будет такой же, как 'select COUNT (*) из [table]'? Потому что на данный момент это не так. –

ответ

0

Это может быть яснее и включает в себя только один SELECT:

select @rowcount = case @active 
    when 0 then sum(case when GETDATE() BETWEEN StartTime AND EndTime then 1 else 0 end) 
    when 1 then sum(case when GETDATE() BETWEEN StartTime AND EndTime then 0 else 1 end) end 
from [table] 
where [email protected] 

Или это предложение от @Damien_The_Unbeliever даже pithier (хотя, возможно, менее понятно!):

select @rowcount = sum(case when GETDATE() BETWEEN StartTime AND EndTime then [email protected] else [email protected] end) 
from [table] 
where [email protected] 
+1

Может быть скомпрометировано это с помощью '1- @ active' и' 0 + @ active' в качестве двух выражений для внутреннего 'case'. –

+0

Спасибо - добавили ваше предложение. – strickt01

0
IF @Active=0 select @rowCount=(SELECT CASE 
    WHEN @Active=0 
     THEN select count(1) from [table] WHERE (GETDATE() BETWEEN StartTime AND EndTime) AND [email protected] 
    WHEN @Active=1 
     THEN select count(1) from [table] WHERE NOT(GETDATE() BETWEEN StartTime AND EndTime) AND [email protected] 

вы можете сделать свой вопрос более понятно?

0

Не уверены, если это понятнее, но вот еще один метод, который является немного менее многословным:

SELECT @rowCount = COUNT(1) 
FROM [table] 
WHERE 
    ((GETDATE() BETWEEN StartTime AND EndTime) AND Active = @Active) 
    OR (NOT (GETDATE() BETWEEN StartTime AND EndTime) AND Active = @Active); 
Смежные вопросы