1

同じSQLServerに2つのデータベースがあります。同じコード。

入力パラメータを持つストアドプロシージャがあります@Test INT。あるデータベースNUMERICでは、その入力に値を渡すと、値が切り捨てられ、すべてが正常に機能します。もう1つは、同じことを行うと、次のエラーが発生します。

データ型numericをintに変換中にエラーが発生しました

ストアドプロシージャのシグネチャは次のとおりです。

CREATE PROCEDURE [dbo].[blProductGetTariff]
(
    @CurrencyID             INT,
    @ProductID              INT,
    @TradeDate              DATETIME,
    @TotalDays              INT,
    @onTariff               NUMERIC(22, 10) OUTPUT
)

そして、これが私がそのストアドプロシージャを呼び出す方法です:

EXEC blProductGetTariff @CurrencyID, 
                        @MTPLY_VolumeID, 
                        @TradeDate, 
                        @VolumeParam, 
                        @VolumeMultiplierRate OUTPUT

@VolumeParamは数値であり@TotalDays、1つのデータベースでは正常にフィードされますが、2番目のデータベースではフィードされません。

これに関与する可能性のあるデータベース設定は何でしょうか?1つありますか?または私は何かが欠けています、そしてこの奇妙な行動には他の理由がありますか?

更新:Darinは、以下のコメントの1つで非常に良い点を指摘しました。「また、上記のコードを見ると、numeric(22,10)を渡すと、intがオーバーフローする可能性があります。その場合は、数値を小さくするか、整数を渡します」..彼は正しかった。したがって、INTをBIGINTに変更すると問題は解決しましたが、最初のデータベースで発生しない理由はまだわかりません。INTですべてが正常に機能し、テストにまったく同じデータ(実際には同じファイル)を使用します。

4

1 に答える 1

4

NUMERIC_ROUNDABORT、arithabort、またはarithignoreのデータベース全体の設定を扱っていると思います。あなたはここでもっと読むことができます:

arithignore http://msdn.microsoft.com/en-us/library/ms184341.aspx

arithabort http://msdn.microsoft.com/en-us/library/ms190306.aspx

NUMERIC_ROUNDABORT http://msdn.microsoft.com/en-us/library/ms188791.aspx

クエリの前にこれを行うと、エラーが無視されると思います。しかし、これは長期的にはやりたいことではないかもしれません。procを修正するのがおそらく最善です。

SET NUMERIC_ROUNDABORT OFF

ほとんどの場合、データベースのNUMERIC_ROUNDABORTの値は異なります。SSMSでデータベースを右クリックし、[プロパティ]をクリックします。オプションに移動すると、この設定が[その他]の下に表示されます。

于 2013-02-20T17:17:22.973 に答える