Sql 内置的MAX函数只返回一个整数
我试图编写一个存储过程(使用SQLServerManagementStudio 2008 R2)从表中检索最大度量值。这似乎很容易做到,因此我编写了一个简短的存储过程来获取最大值。但是,当我运行该过程时,它返回了一个0,而不是预期的0.018值 当我将鼠标悬停在MAX函数上时,它会显示“内置函数MAX(表达式)返回int”。因此,它似乎将我的结果转换为int。这相当烦人 我想我将不得不计算最大值,除非这里有人有一个更简单的解决方案。有什么想法吗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
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没问题,如果我更新得太晚,我忘了如果效果更好,您也可以使用输出变量:)噢。。。这样效果更好。我真不敢相信我竟然忘了我可以使用输出变量。