2012-04-20 36 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 

结果集可以有许多行和任何数据类型