2017-05-26 119 views
0

不幸的是,我有兩個表來比較兩個表之間的浮點數據類型。我已經閱讀了試着轉換,轉換,使用一個小的差異,並嘗試所有。存儲過程中的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變量也是一個float轉化爲numeric(1, 0)。我已經驗證RiskFactor列中的值只有0,1,2和3,並且(通過調試)@newEnvScore的值爲2.我還驗證了我的查詢有一行代碼= 「RISK_LEVEL_ENVIRONMENTAL」和RiskFactor = 2

我已經通過調試,失敗是由於@newEnvRiskLevel住在-1驗證和@errorCode爲0

我也試着投以十進制和int,轉換爲int,以及「rl.RiskFactor - @newEnvScore < 1」在我的where子句中,其中沒有一個設置newEnvRiskLevel。

正如我所說的,它是只有當運行此存儲過程失敗發生,這是我真的不明白的部分。我期望SQL Server是確定性的,無論SQL是運行存儲過程的主體,還是在SSMS選項卡中運行完全相同的SQL。

+3

那麼有什麼不工作?你有錯誤嗎?它不會返回正確的信息嗎? –

+0

提供表格的上下文也會有幫助。是的,我知道你告訴我們什麼是價值觀,但是現在打敗一些有形的數據來粘貼你的遊戲。 –

+0

另外,我在執行諸如convert(numeric(1,0),rl.RiskFactor)= @newEnvScore等演員時發現了問題。你有沒有試過convert(numeric(1,0),rl.RiskFactor)= Convert(numeric(1,0),@ newEnvScore)?冗餘也許當鑄造時會發生奇怪的事情... –

回答

0

不幸的是,你並沒有發佈你的存儲過程,也沒有完整的腳本。沒有有用的證明就很難診斷問題。但是我看到了在很多方面都涉及到的「goto」的用法。我還看到使用select語句分配一個局部變量 - 這通常是一個問題,因爲開發人員可能會假設一個分配總是發生。爲了證明 - 與獎金在年底

set nocount on; 
declare @risk smallint; 
declare @risklevels table (risklevel float primary key, code varchar(10)); 
insert @risklevels(risklevel, code) values (1, 'test'), (2, 'test'), (-5, 'test'); 

-- here is your assignment logic. Notice that @risk is 
-- never changed because there are no matching rows. 
set @risk = 0; 
select @risk = risklevel from @risklevels where code = 'zork'; 
select @risk; 

-- here is a better IMO way to make the assignment. Note that 
-- @risk is set to NULL when there are no matching rows. 
set @risk = -1; 
set @risk = (select risklevel from @risklevels where code = 'zork'); 
select @risk; 

-- and a last misconception. What value is @risk set to? and why? 
set @risk = -1; 
select @risk = risklevel from @risklevels where code = 'test'; 
select @risk; 

這是否是你的問題的來源(或有助於它)我不能說。但這是一種可能性。將整數存儲在浮點數據類型中通常只是一個問題。即使無法更改表格,也可以更改本地變量並強制使用更適合的數據類型。所以也許這是你應該考慮的另一個改變。

+0

感謝您的想法。撲克相當大,我不想壓倒每個人。至於使用null,我最初使用該值而不是-1,然後在我的if語句中檢查'is null'。不管是null還是-1都是一個虛擬值,它告訴我我不匹配。正如我上面所說的那樣,這是一次性的大規模更新,因此手動運行無損傷;現在我只是好奇爲什麼在SSMS中的選項卡中執行SQL的行爲不同於CREATE PROCEDURE語句中包含的確切SQL,然後執行該過程。 –