残念ながら、浮動小数点データ型を比較する2つのテーブルがあります。私はキャスト、変換者、小さな違いを使用して試してみて、それらを試してみました。ストアドプロシージャ内のSQL Serverの浮動小数点比較
奇妙な部分は、これはストアドプロシージャを実行しているときにのみ失敗します。ストアドプロシージャの本体をSSMSウィンドウに切り取って貼り付けると、うまく動作します。
サンプルSQL:
set @newEnvRiskLevel = -1
select
@newEnvRiskLevel = rl.RiskLevelId
from
LookupTypes lt
inner join
RiskLevels rl on lt.LookupTypeId = rl.RiskLevelTypeFk
where
lt.Code = 'RISK_LEVEL_ENVIRONMENTAL'
and convert(numeric(1, 0), rl.RiskFactor) = @newEnvScore
set @errorCode = @@ERROR
if (@newEnvRiskLevel = -1 or @errorCode != 0)
begin
print 'newEnvScore = ' + cast(@newEnvScore as varchar) + ' and risk level = ' + cast(isnull(@newEnvRiskLevel, -1) as varchar)
print 'ERROR finding environmental risk level for code ' + @itemCode + ', skipping record'
set @recordsErrored = @recordsErrored + 1
goto NEXTREC
end
マイ@newEnvScore
変数もnumeric(1, 0)
に変換float
です。私はRiskFactor列に値0,1,2、および3しかないことを確認しました(デバッグを介して)@newEnvScore
の値は2です。私のクエリにはコード= 「RISK_LEVEL_ENVIRONMENTAL」とRiskFactor = 2
私は障害がで-1滞在@newEnvRiskLevelに起因して、デバッグを経由して検証してきましたし、その@errorCodeは私も両方の10進数のキャストを試してみた0
で、 int、intに変換し、 "rl.RiskFactor - @newEnvScore < 1"を私のwhere節に置き換えます。いずれもnewEnvRiskLevelを設定しません。
私が言うように、これはしか実行されませんが、実際には理解できない部分です。私は、SQLがストアドプロシージャの本体を実行しているのか、まったく同じSQLをSSMSタブに実行しているのかにかかわらず、SQL Serverが決定論的であることを期待しています。
何が問題なのですか?間違いはありますか?正しい情報は返されませんか? –
テーブルのコンテキストを提供することも役に立ちます。うん、私は値が何であるか教えてくれたことは知っていますが、今のところペーストするための具体的なデータはありません。 –
また、変換(数値(1、0)、rl.RiskFactor)= @newEnvScoreなどのキャストを実行する際に問題が見つかりました。変換してみましたか(数値(1、0)、rl.RiskFactor)=変換(数値(1、0)、@newEnvScore)?おそらく奇妙なことが鋳造時に起こる可能性がある冗長... –