2016-04-25 92 views
0

我正在處理各種與其數據類型混淆的遺留數據庫。有列應該是integers,但保存爲varchar(9)。我正在創建表格的新版本並嘗試正確導入整數值。我有需要被轉換爲int的字段如下聲明:SQL Server isnumeric將varchar視爲十六進制值,但不會更改爲int

CASE 
    ISNUMERIC(fieldname) 
     WHEN 0 THEN NULL 
     ELSE CAST(fieldname AS int) AS fieldname 

,保持跳閘這件事是值:029999E00

錯誤是:轉換VARCHAR值 '029999E00' 爲int類型時

轉換失敗。

大多數時候,這個工程很好,會給我一個有效的int值或NULL。

爲什麼ISNUMERIC說這個值是int,但是CAST無法轉換它?我也試過bigint,我得到了同樣的結果。是否有另一種方法來檢查這樣的值?

還有一篇關於使用ISNUMERIC作爲解決方案的文章,但ISNUMERIC在這種情況下不起作用。我需要另一個選項來檢查一個數值,或者確保CAST語句在獲取值時不會失敗,如果它是十六進制值。

+3

快速版本是:'ISNUMERIC'不是確定值是否可以轉換爲'INT'的可靠方法。你使用的是什麼版本的SQL Server? – Siyual

+1

這是一篇很好的文章,解釋ISNUMERIC的一些缺陷。 http://www.sqlservercentral.com/articles/ISNUMERIC%28%29/71512/ –

+0

這些值應該是十六進制?因爲'ISNUMERIC'將您的示例解釋爲科學記號編號'299999 * 10^0' – Stavr00

回答

0

爲什麼不使用TRY_CONVERT?如果它可以創建一個INT,否則它將返回NULL。

+0

當你有足夠的聲望時,請使用「添加註釋」來顯示你的個人建議,謝謝 –

+0

@ Brian-N:好主意,但我在MS SQL 2008上,根據[MSDN](https: //msdn.microsoft.com/en-us/library/hh230993.aspx)。 –