我正在尝试编写存储过程(使用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
答案 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
结果集可以包含许多行和任何数据类型的多列