2011-07-21 10 views
0

を返されていない -SQLのSUM負の値は、私はこのようになりますSQLクエリを持って

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 

私はこのようなストアドプロシージャを実行すると -

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 

を私は2つの結果を得ます。最初のものは-0.0060であり、2番目の@return_valueは0です。

これは、私のコードからストアドプロシージャを呼び出すときに、私が望む-0.0060ではなく0を返します。

私は私のコードからストアドプロシージャを呼び出すのですか。これは、次のとおりです。

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) 

これが起こってかもしれない、なぜ誰もが任意のアイデアを持っていますか?

ありがとうございます!

+0

実際には、 '' SUM(nits)is Null THEN 0'の代わりに '' SUM(nits) ''を意味しますか? – Rahul

答えて

3
DECLARE @return_value as int 

変数はintとして定義されています。 intは小数値を保持できないため、戻り値は丸められます。あなたのvarをfloatと宣言してください。

List of SQL Server data types

+0

ああ、申し訳ありません、他のフォーマットでも0に戻ります。 – TGuimond

+0

あなたの 'CREATE PROC'を投稿できますか?また、あなたのクエリーの最初の' SUM'(nits)にタイプミスがあります。 – Jacob

+0

変数をfloatに変更することは役に立ちません:内部のRETURNストアドプロシージャは常にintです。これは4つのアップベクトルにはふさわしいものではありません。だから-1 – gbn

0

精度で小数として戻り値を宣言してください。

DECLARE @return_value as decimal(18,4) 

なぜ、1つの列を返すだけのデータセットを埋めているのですか。 sqldatareaderを使用し、値を10進数で取得します。データセットは大量のリソースを消費します。

+1

RETURN経由の@return_valueは常にintです – gbn

+0

彼はストアドプロシージャ内で何をしているのでしょうか?他のインスタンスは、管理スタジオでprocを実行するために使用されます。私の答えの最初の部分は誤解を招くものですが、2番目の部分はうまくいくと思います。 –

1

RETURNは常にintであるため、ストアドプロシージャ内で切り捨てられます。 As per MSDN

RETURN [integer_expression]

あなたはフロートであるOUTPUTパラメータを使用する必要があります。

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 

をそして、あなたは

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があるとして、それを呼び出します実行時にのみ使用される私たちは通常、意味のあるデータを出力パラメータまたは結果セット経由で受け取ります。私はもはやRETURNを使用しません...

+0

すべての共同downvoteと一緒に行くmment?またはそれは*復讐*ですか? – gbn

+0

私はこれをdownvoteしなかった。しかし、質問を正しく読まなかったようです。あなたは出力パラメータを使う必要があると言っていますが、彼は望むように結果セットを選択するだけで正しいことをやっています。また、出力パラメータは1つの値しか返すことができません。私はちょうど質問者が望むものについて混乱しているかもしれません。 –

+0

@coder net:私は、編集前にproc呼び出しに基づいてRETRUNが実際のデータに使用されていると仮定しました。 – gbn

関連する問題