如何 return 来自存储过程的十进制值
how to return decimal value from stored procedure
我有一个存储过程,它不是 returning 正确的值,例如。它应该 return 33.30 但它 returns 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 S_P_batchno=@batchno And IsSample=@IsSample Order By S_en DESC;
--If Sale Qty is more than Stock
IF (@ttavail <= @stqty) BEGIN
SET @stqty = @stqty - @ttavail;
SET @ttsold=@ttsold + @ttavail;
SET @NetRate=@NetRate+(@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 @NetRate=@NetRate+(@Nr*@stqty);
Print (@NetRate);
SET @stqty = 0;
END
Update STOCK Set S_P_ttavail = @ttavail, S_P_ttsold=@ttsold Where S_en=@S_en And IsSample=@IsSample
END
print @NetRate
return @NetRate
END
当我在 SSMS 中执行它时,我得到了结果
和显示我打印的值的消息,它显示数据获取 n 计算给出了正确的结果 [参见上次打印的值]。
我需要这个值保存在另一个 table 中,所以这是 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;
请帮助我。谢谢。
return 值只能是整数。
使用输出参数从过程中获取结果:
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;
我知道,来不及回答了。由于 Guffa 已经提出了一个很好的解决方案,它会 return 根据您的需要更正结果。
但是,我仍然想与您分享另一种解决方案。
在存储过程的末尾使用 select 语句而不是 return 语句。
Update STOCK Set S_P_ttavail = @ttavail, S_P_ttsold=@ttsold Where S_en=@S_en And IsSample=@IsSample
END
Select @NetRate As NetRate
END
并使用 ExecuteScalar()
方法执行您的存储过程。如何避免在存储过程中声明不必要的参数。
var dNetRate = cmd.ExecuteScalar();
但是,如果您在存储过程中创建另一个参数没有问题,我仍然建议您使用输出参数,否则您可以坚持使用此解决方案。
我还必须在 SqlParameter
class
中指定精度和比例
var output = new SqlParameter("output", SqlDbType.Decimal)
{
Direction = ParameterDirection.Output,
Precision = 18,
Scale = 2
};
var sql = "exec dbo.SomeOperation @output OUT";
var result = this.Database.ExecuteSqlCommand(sql, output);
return (decimal)output.Value;
没有它,我得到的值总是没有小数点,即使数据类型是小数。
我有一个存储过程,它不是 returning 正确的值,例如。它应该 return 33.30 但它 returns 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 S_P_batchno=@batchno And IsSample=@IsSample Order By S_en DESC;
--If Sale Qty is more than Stock
IF (@ttavail <= @stqty) BEGIN
SET @stqty = @stqty - @ttavail;
SET @ttsold=@ttsold + @ttavail;
SET @NetRate=@NetRate+(@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 @NetRate=@NetRate+(@Nr*@stqty);
Print (@NetRate);
SET @stqty = 0;
END
Update STOCK Set S_P_ttavail = @ttavail, S_P_ttsold=@ttsold Where S_en=@S_en And IsSample=@IsSample
END
print @NetRate
return @NetRate
END
当我在 SSMS 中执行它时,我得到了结果
和显示我打印的值的消息,它显示数据获取 n 计算给出了正确的结果 [参见上次打印的值]。
我需要这个值保存在另一个 table 中,所以这是 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;
请帮助我。谢谢。
return 值只能是整数。
使用输出参数从过程中获取结果:
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;
我知道,来不及回答了。由于 Guffa 已经提出了一个很好的解决方案,它会 return 根据您的需要更正结果。
但是,我仍然想与您分享另一种解决方案。
在存储过程的末尾使用 select 语句而不是 return 语句。
Update STOCK Set S_P_ttavail = @ttavail, S_P_ttsold=@ttsold Where S_en=@S_en And IsSample=@IsSample
END
Select @NetRate As NetRate
END
并使用 ExecuteScalar()
方法执行您的存储过程。如何避免在存储过程中声明不必要的参数。
var dNetRate = cmd.ExecuteScalar();
但是,如果您在存储过程中创建另一个参数没有问题,我仍然建议您使用输出参数,否则您可以坚持使用此解决方案。
我还必须在 SqlParameter
class
var output = new SqlParameter("output", SqlDbType.Decimal)
{
Direction = ParameterDirection.Output,
Precision = 18,
Scale = 2
};
var sql = "exec dbo.SomeOperation @output OUT";
var result = this.Database.ExecuteSqlCommand(sql, output);
return (decimal)output.Value;
没有它,我得到的值总是没有小数点,即使数据类型是小数。