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

Sql 内置的MAX函数只返回一个整数,sql,sql-server,stored-procedures,max,Sql,Sql Server,Stored Procedures,Max,我试图编写一个存储过程(使用SQLServerManagementStudio 2008 R2)从表中检索最大度量值。这似乎很容易做到,因此我编写了一个简短的存储过程来获取最大值。但是,当我运行该过程时,它返回了一个0,而不是预期的0.018值 当我将鼠标悬停在MAX函数上时,它会显示“内置函数MAX(表达式)返回int”。因此,它似乎将我的结果转换为int。这相当烦人 我想我将不得不计算最大值,除非这里有人有一个更简单的解决方案。有什么想法吗 ALTER PROCEDURE [dbo].[Ge

我试图编写一个存储过程(使用SQLServerManagementStudio 2008 R2)从表中检索最大度量值。这似乎很容易做到,因此我编写了一个简短的存储过程来获取最大值。但是,当我运行该过程时,它返回了一个0,而不是预期的0.018值

当我将鼠标悬停在MAX函数上时,它会显示“内置函数MAX(表达式)返回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
您必须执行
MAX(转换(值为十进制(18,6))

我猜
不是小数,因此您必须在赋值之前强制转换它

更新

如果
Value
确实是一个十进制数(18,6),那么您需要确保表中的值。因为,正如你从我的例子中看到的,这应该是可行的


最后一件可能更麻烦的事情是返回一个整数。我认为你做不到。您必须执行
选择@MaxOsc
或使用变量存储过程以三种方式进行通信:返回值、输出参数和结果集

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

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
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
这只适用于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 @SelectedValue = GetMyInt @Param
PRINT @SelectedValue
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 @SelectedValue int
       ,@Param         int
SET @Param=1
EXEC @SelectedValue = GetMyInt @Param
PRINT @SelectedValue
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 

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

MAX()将采用它正在计算的列的数据类型。当您自己运行查询而不使用存储过程时会发生什么情况?值是一个可为空的十进制数(18,6)。当我自己运行查询时,它工作得很好。值是一个可为空的十进制数(18,6)。我试着像你建议的那样铸造它,以防可为空的部分弄乱了它,但它仍然不起作用。@Lara我更新了我的答案。最后一项很可能是您的问题。我将“RETURN@MaxOsc”改为“SELECT@MaxOsc”,效果很好,谢谢。@Lara没问题,如果我更新得太晚,我忘了如果效果更好,您也可以使用输出变量:)噢。。。这样效果更好。我真不敢相信我竟然忘了我可以使用输出变量。