SQL SUM negativer Wert wird nicht zurückgegeben

Ich habe eine SQL Query, die so aussieht –

CREATE PROCEDURE [dbo].[getMemberFundUnits] -- Add the parameters for the stored procedure here @member int, @fundcode varchar(15), @closingdate datetime AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for procedure here SELECT (CASE WHEN SUM(units) IS Null THEN 0 ELSE SUM(units) END) As fundunits FROM pe_minv WHERE pmi_member = @member AND pmi_fund = @fundcode AND pmi_invested <= @closingdate END 

Wenn ich die gespeicherte Prozedur wie diese –

 DECLARE @return_value as float /*int*/ EXEC @return_value = [dbo].[getFundUnits] @member = 9738, @fundcode = N'58193', @closingdate = N'07/21/2011' SELECT 'Return Value' = @return_value 

Ich bekomme zwei Ergebnisse. Die erste ist die richtige, die -0.0060 und die zweite @return_value, die 0

Dies ist auch der Fall, wenn ich die gespeicherte Prozedur aus meinem Code anrufe, bekomme ich eine 0 zurück anstatt der -0.0060, die ich will.

So rufe ich die gespeicherte Prozedur aus meinem Code an:

  Dim ds As New DataSet() Dim cmd As New SqlCommand("getMemberFundUnits", conn) cmd.CommandType = CommandType.StoredProcedure Dim p_pm_member As New SqlParameter("@member", SqlDbType.Int) p_pm_member.Value = pm_member cmd.Parameters.Add(p_pm_member) Dim p_fund_code As New SqlParameter("@fundcode", SqlDbType.VarChar) p_fund_code.Value = fund_code cmd.Parameters.Add(p_fund_code) Dim p_period_closing_date As New SqlParameter("@closingdate", SqlDbType.DateTime) p_period_closing_date.Value = period_closing_date cmd.Parameters.Add(p_period_closing_date) Dim da As New SqlDataAdapter(cmd) da.Fill(ds) 

Hat jemand irgendwelche Ideen, warum dies geschehen könnte?

Vielen Dank!

 DECLARE @return_value as int 

Ihre Variable ist definiert als int. Int kann keine Dezimalwerte halten, also wird der Rückgabewert gerundet. Versuchen Sie, Ihr var als float zu deklarieren.

list der SQL server-datatypen

Das RETURN ist immer int so, dass es innerhalb der gespeicherten Prozedur abgeschnitten wird. Wie pro MSDN

RETURN [integer_expression]

Sie müssen einen OUTPUT-Parameter verwenden, der float ist:

 CREATE PROC [dbo].[getFundUnits] @member..., @fundcode...', @closingdate..., @SummedValue float OUTPUT AS ... SELECT @SummedValue = (CASE WHEN SUM(nits) IS Null THEN 0 ELSE SUM(units) END) As fundunits ... GO 

Und du nennst es als

 DECLARE @return_value as float EXEC [dbo].[getFundUnits] @member = 9738, @fundcode = N'58193', @closingdate = N'07/21/2011', @return_value OUTPUT SELECT 'Return Value' = @return_value 

RETURN wird (wenn überhaupt) nur für den Ausführungsstatus gewöhnlich verwendet: aussagekräftige data über Ausgabeparameter oder ein Resultset. Ich benutze nicht mehr RETURN …

Versuchen Sie, den Rückgabewert als Dezimal mit Präzision zu deklarieren.

 DECLARE @return_value as decimal(18,4) 

Auch warum füllt ihr einen datasatz, um nur eine Spalte zurückzugeben. Verwenden Sie einen sqldatareader und rufen Sie die Werte als dezimal ab. Dataset ist sehr ressourcenintensiv.