2015-02-26 2 views
3

У меня есть хранимая процедура, которая не возвращает правильное значение, например. он должен вернуть 33,30, но он возвращает 33,00, что нежелательно. это моя хранимая процедура, я использую SQL сервер 2008как вернуть десятичное значение из хранимой процедуры

ALTER PROCEDURE [dbo].[sp_UpdateStockForSale] 
@prodName varchar(40), 
@stqty numeric(9,2), 
@batchno varchar(40), 
@IsSample varchar(5) 
AS 
BEGIN 
SET NOCOUNT ON; 
DECLARE @S_en int; 
DECLARE @ttavail numeric(9,0); 
DECLARE @ttsold numeric(9,0); 
DECLARE @Nr decimal(9,2); 
DECLARE @NetRate decimal(9,2) 
SET @NetRate=0.0; 
While (@stqty > 0) BEGIN 

    Select @S_en=S_en,@ttavail=S_P_ttavail, @ttsold=S_P_ttsold,@Nr=NetRate From STOCK WHERE S_P_ttavail>0 AND S_P_name = @prodName AND [email protected] And [email protected] Order By S_en DESC; 

    --If Sale Qty is more than Stock 
    IF (@ttavail <= @stqty) BEGIN 
     SET @stqty = @stqty - @ttavail; 
     SET @[email protected] + @ttavail; 
     SET @[email protected]+(@Nr*@ttavail); 
     Print (@NetRate); 
     SET @ttavail = 0; 
    END 
    --If Sale Qty is less than STOCK 
    ELSE IF(@stqty < @ttavail) BEGIN 
     SET @ttsold = @ttsold + @stqty  
     SET @ttavail = @ttavail - @stqty; 
     SET @[email protected]+(@Nr*@stqty); 
     Print (@NetRate); 
     SET @stqty = 0; 
    END 
    Update STOCK Set S_P_ttavail = @ttavail, [email protected] Where [email protected]_en And [email protected] 
END 
print @NetRate 
return @NetRate 
END 

, когда я исполняю его в SSMS я получаю результат

enter image description here

и сообщение, которое показывает значения я отпечатанные, который показывает данные, получающие n вычислений, дают правильный результат [см. последнее напечатанное значение]. enter image description here

Мне нужно это значение, чтобы сохранить в другой таблице, так что это C# код

cmd = new SqlCommand("sp_UpdateStockForSale ", conn); 
           cmd.CommandType = CommandType.StoredProcedure; 
           cmd.Parameters.AddWithValue("@prodName", dataGridView1.Rows[i].Cells["P_name"].Value); 
           cmd.Parameters.AddWithValue("@stqty", dataGridView1.Rows[i].Cells["P_otabs"].Value); //total tabs 
           cmd.Parameters.AddWithValue("@batchno ", dataGridView1.Rows[i].Cells["P_batch_no"].Value); 
           cmd.Parameters.AddWithValue("@IsSample ", dataGridView1.Rows[i].Cells["IsSample"].Value); 

           var returnParameter = cmd.Parameters.Add("@NetRate", SqlDbType.Decimal); 
           returnParameter.Direction = ParameterDirection.ReturnValue; 
           cmd.ExecuteNonQuery(); 
           var result = returnParameter.Value; 

пожалуйста, помогите мне .thanks.

+4

сделать '@ return_value' десятичным (18,2) например? – Milen

+5

'RETURN' из sproc используется для возврата ** целочисленного кода ошибки **. Если вы хотите вывести значение, вы должны использовать параметр OUTPUT (или, более типично, просто ВЫБЕРИТЕ его и попросите читателя прочитать значение). – TZHX

+1

Боковое примечание: вы не должны ** использовать префикс 'sp_' для ваших хранимых процедур. Microsoft [зарезервировала этот префикс для собственного использования (см. * Именование сохраненных процедур *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) и вы рискуете столкнуться с именем когда-нибудь в будущем. [Это также плохо для производительности вашей хранимой процедуры] (http: // www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Лучше просто просто избегать 'sp_' и использовать что-то еще в качестве префикса - или никакого префикса вообще! –

ответ

2

Я знаю, Слишком поздно давать ответ. Поскольку Гуффа уже предложил хорошее решение, и он вернет правильный результат, как вы хотите.

Но все же есть еще одно решение, которое я хотел бы поделиться с вами этим.

использовать инструкцию select в конце хранимой процедуры вместо оператора return.

 Update STOCK Set S_P_ttavail = @ttavail, [email protected] Where [email protected]_en And [email protected] 
    END 
    Select @NetRate As NetRate 
END 

и выполнить хранимую процедуру с использованием метода ExecuteScalar(). Как вы можете избежать ненужного объявления параметра в хранимой процедуре.

var dNetRate = cmd.ExecuteScalar(); 

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

+0

Спасибо за объяснение. Это довольно легко для меня. – varsha

4

Возвращаемое значение может быть только целым числом.

Используйте выходной параметр, чтобы получить результат от процедуры:

ALTER PROCEDURE [dbo].[sp_UpdateStockForSale] 
    @prodName varchar(40), 
    @stqty numeric(9,2), 
    @batchno varchar(40), 
    @IsSample varchar(5), 
    @NetRate decimal(9,2) output 
AS 
... 

Назовите это с помощью:

declare @Result decimal(9,2) 

exec 
    [dbo].[sp_UpdateStockForSale] 
    @prodName = N'vicks', 
    @stqty = 30, 
    @batchno = N'v7', 
    @IsSample = N'false', 
    @NetRate = @Result output 

В C# вы бы создать выходной параметр и добавить к параметрам перед вызовом :

SqlParameter result = new SqlParameter("@NetRate", SqlDbType.Decimal); 
result.Direction = ParameterDirection.Output; 
command.Parameters.Add(result); 

После вызова (и чтения набора результатов, если таковой имеется) вы может получить значение от параметра:

Decimal netRate = (Decimal)result.Value; 
+0

таким образом мне нужно предоставить любое значение @NetRate? – varsha

+0

@varsha: Нет, вам нужно указать, куда должно идти выходное значение. См.: [Возврат данных с помощью параметров OUTPUT] (https://technet.microsoft.com/en-us/library/ms187004%28v=sql.105%29.aspx) – Guffa

+1

@ Guffa '@ nextrate' был использован для sum, поэтому нужно объявить новую переменную для 'output' –

Смежные вопросы