3

テーブルから最大測定値を取得するストアド プロシージャ (SQL Server Management Studio 2008 R2 を使用) を作成しようとしています。これは簡単なことのように思えたので、MAX を取得するための短いストアド プロシージャを作成しました。しかし、プロシージャを実行すると、予想される 0.018 値ではなく 0 が返されました。

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)))

は10進数ではないと推測しているValueので、割り当ての前にキャストする必要があります

これは、テーブルが10進数として設定されている場合に、これが機能することを証明するSQLFiddleです。

これは、キャストが必要であることを示すSQLFiddleです。

アップデート

が実際にDecimal(18,6)である場合Valueは、テーブル値を確認する必要があります。なぜなら、私の例からわかるように、これはうまくいくはずです

おそらくもっとあなたの問題である最後のことはあなたが整数を返しているということです。SQLServerでは整数以外のものを返すことはできないと思います。を実行するSELECT @MaxOscか、OUTPUT変数を使用する必要があります

于 2012-04-20T16:21:41.333 に答える
1

ストアド プロシージャは、RETURN 値、OUTPUT パラメータ、および結果セットの 3 つの方法で通信します。

戻り
値 整数を返す必要がある場合は、次のメソッドを使用できます。

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

RETURN は 1 つの int 値しか返すことができず、null はゼロに変換されるため、これは INT に対してのみ機能します。

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 

出力パラメーターは 1 つの値のみを返すことができますが、任意のデータ型にすることができます

結果セットの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 に答える