内置MAX函数只返回一个整数

时间:2012-04-20 16:14:25

标签: sql sql-server stored-procedures max

我正在尝试编写存储过程(使用SQL Server Management Studio 2008 R2)从表中检索最大测量值。这似乎是一件容易的事,所以我写了一个简短的存储过程来获取MAX。但是,当我运行该过程时,它返回0而不是预期的0.018值。

当我将鼠标悬停在MAX功能上时,它会显示“内置函数MAX(表达式)RETURNS int”。所以它似乎是把我的结果作为一个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 SerialNumber=@SerialNumber AND Date=@Date AND Value IS NOT NULL


    RETURN @MaxOsc

    SET NOCOUNT OFF
END

2 个答案:

答案 0 :(得分:3)

你必须MAX(CAST(Value AS DECIMAL(18,6)))

我猜测Value不是DECIMAL,所以你必须在作业之前施放它

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确实是十进制(18,6),那么您需要确保您的表值。因为,正如您从我的示例中看到的那样,这应该可行

最后一件可能更多的问题是你要返回一个整数。我认为你不能return anything but an integer in SQL Server。您必须执行SELECT @MaxOsc或使用OUTPUT变量

答案 1 :(得分:1)

存储过程以三种方式进行通信:RETURN值,OUTPUT参数和结果集

返回值
如果需要返回一个整数,可以使用以下方法:

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值,而null则转换为零。

输出参数
您可以使用输出参数:

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 

输出参数只能返回一个值,但可以是任何数据类型

结果设置 对于结果集,请执行以下过程:

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 

结果集可以包含许多行和任何数据类型的多列