2012-04-20 69 views
2

我想寫一個存儲過程(使用SQL Server Management Studio 2008 R2)從表中檢索最大測量值。這似乎是一件容易的事情,所以我編寫了一個簡短的存儲過程來獲取MAX。但是,當我運行該過程時,它返回0而不是預期的0.018值。內置的MAX函數只返回一個整數

當我將鼠標懸停在MAX函數上時,它顯示「內置函數MAX(expression)RETURNS int」。所以它似乎將我的結果作爲一個整數。這很煩人。

我想我必須計算最長的路,除非這裏有人有一個更簡單的解決方案。有任何想法嗎?

ALTER PROCEDURE [dbo].[GetMaxOscillation] (@SerialNumber varchar (16), @Date datetime) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @MaxOsc DECIMAL(18,6) 

    SELECT @MaxOsc = MAX(Value) 
    FROM LoadListingOscillations 
    WHERE [email protected] AND [email protected] AND Value IS NOT NULL 


    RETURN @MaxOsc 

    SET NOCOUNT OFF 
END 
+1

MAX(許多列)將採取它正在評估的列的數據類型。 – 2012-04-20 16:18:15

+0

在沒有存儲過程的情況下自行運行查詢會發生什麼? – antlersoft 2012-04-20 16:19:15

+0

值是可以爲空的Decimal(18,6)。當我自己運行查詢時,它工作得很好。 – Lara 2012-04-20 16:26:26

回答

3

你要做MAX(CAST(Value AS DECIMAL(18,6)))

我猜測的Value不是小數,所以你必須分配

Here is the SQLFiddle to prove that if the table is set up as a Decimal then this will work

Here is a SQLFiddle that shows that the cast is needed

之前將其丟更新

如果Value確實是Decimal(18,6),那麼您需要確保表值。因爲,從我的示例中可以看出,這應該起作用

最後一件可能更多是您的問題的是您正在返回一個整數。我不認爲你可以return anything but an integer in SQL Server。你將不得不做一個SELECT @MaxOsc或使用OUTPUT變量

+0

值是可以爲空的DECIMAL(18,6)。我試着像你所建議的那樣只是爲了防止可空的部分搞亂了它,但它仍然不起作用。 – Lara 2012-04-20 16:30:36

+0

@Lara我更新了我的答案。最後一個項目很可能是你的問題 – 2012-04-20 16:33:39

+0

我將「RETURN @MaxOsc」更改爲「SELECT @MaxOsc」,並表示謝謝。 – Lara 2012-04-20 16:37:13

1

存儲過程有三種方式溝通:返回值,輸出參數和結果集

返回值
如果需要返回整數,你可以用這個方法:

CREATE PROCEDURE GetMyInt 
(@Param int) 
AS 
DECLARE @ReturnValue int 

SELECT @ReturnValue=MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param 
RETURN @ReturnValue 
GO 

,現在叫喜歡你的程序:

DECLARE @SelectedValue int 
     ,@Param   int 
SET @Param=1 
EXEC @SelectedValue = GetMyInt @Param 
PRINT @SelectedValue 

這隻適用於INT,因爲RETURN只能返回一個int值並且零值被轉換爲零。

輸出參數
您可以使用輸出參數:

CREATE PROCEDURE GetMyInt 
(@Param  int 
,@OutValue int OUTPUT) 
AS 
SELECT @OutValue=MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param 
RETURN 0 
GO 

現在打電話給你的程序,如:

DECLARE @SelectedValue int 
     ,@Param   int 
SET @Param=1 
EXEC GetMyInt @Param, @SelectedValue OUTPUT 
PRINT @SelectedValue 

輸出參數只能返回一個值,而可以是任何數據類型

RESULT SET 對結果集做出這樣的過程:

CREATE PROCEDURE GetMyInt 
(@Param  int) 
AS 
SELECT MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param 
RETURN 0 
GO 

這樣使用它:

DECLARE @ResultSet table (SelectedValue int) 
DECLARE @Param int 
SET @Param=1 
INSERT INTO @ResultSet (SelectedValue) 
    EXEC GetMyInt @Param 
SELECT * FROM @ResultSet 

結果集可以有許多行和任何數據類型