3

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

当我将鼠标悬停在 MAX 函数上时,它会显示“内置函数 MAX(expression) 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
4

2 回答 2

3

你所要做的MAX(CAST(Value AS DECIMAL(18,6)))

我猜Value不是 DECIMAL,所以你必须在分配之前强制转换它

这是证明如果表设置为十进制那么这将工作的 SQLFiddle

这是一个 SQLFiddle,显示需要强制转换

更新

如果Value确实是 Decimal(18,6),那么您需要确保您的表值。因为,正如您从我的示例中看到的那样,这应该有效

最后一件事可能是你的问题是你返回一个整数。我认为您只能在 SQL Server 中返回整数。您将不得不执行SELECT @MaxOsc或使用OUTPUT变量

于 2012-04-20T16:21:41.333 回答
1

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

RETURN VALUE
如果需要返回一个整数,可以使用这个方法:

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 被转换为零。

OUTPUT PARAMETER
你可以使用一个输出参数:

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 

结果集可以有任意数据类型的多行多列

于 2012-04-20T17:55:37.870 回答