Как объяснено в Возвращение данных с использованием кода возврата :
Процедура может возвращать целочисленное значение, называемое кодом возврата, для указания статуса выполнения процедуры.
Просмотрите остальную часть документа («Возвращение данных из хранимой процедуры»), чтобы узнать, как вернуть нецелые данные.
Что касается улучшения кода, существует несколько возможностей. Кажется более естественным сделать эту функцию определенной пользователем, но я сохранил хранимую процедуру и добавил для результата параметр output
. Не ясно, почему значения суммируются отдельно на основе их знаков, а затем суммируются, когда простая сумма дает тот же результат. (Единственное преимущество - ошибочный оператор print
, если нет неположительных значений.) Обратите внимание, что условие where
выполнено sargable , так что индекс можно использовать для повышения производительности.
create procedure izracunajPromet_TaMesec
@Result as Numeric(10,2) output
as
begin
set nocount on
declare @prihodki as Numeric(10,2), @odhodki as Numeric(10,2);
-- Get the current date/time.
declare @Now as DateTime = Current_Timestamp;
-- Calculate the first date of the current month.
declare @MonthStart as Date = DateAdd( day, 1 - Day( @Now ), @Now );
-- Calculate the first date of the next month.
declare @NextMonthStart as Date = DateAdd( month, 1, @MonthStart );
select
-- Use conditional aggregation to get both sums from a single pass through the data.
@prihodki = sum( case when Vrednost >= 0 then Vrednost end ),
@odhodki = sum( case when Vrednost <= 0 then Vrednost end )
from Transakcija
where
-- Filter the date(time) using a half-open interval so that an index can be used.
@MonthStart <= Datum and Datum < @NextMonthStart and
ID_Družine = 1;
-- If either value is NULL then substitute 0.0 and return the result.
set @Result = Coalesce( @prihodki, 0.0 ) + Coalesce( @odhodki, 0.0 );
return;
end;
Пример использования:
declare @MyResult as Numeric(10,2);
execute izracunajPromet_TaMesec @Result = @MyResult output;
select @MyResult;