2011-04-25 111 views
0

查詢錯誤轉換VARCHAR到數字與MSSQL

SELECT TOP 1000 
CASE WHEN VRI.Square_Footage <> '' 
THEN VRI.Square_Footage 
ELSE 
    CASE WHEN VRI.Property_Type = 'LAND' 
     THEN CAST((CONVERT(NUMERIC(38, 3),VRI.Acres)*43560) AS DECIMAL) 
    ELSE 
     VRI.Lot_Size 
    END 
END 
FROM View_Report_Information_Tables AS VRI 

即使我檢查VRI.Acresisnumeric(),它仍然產生相同的確切的錯誤?我該如何解決這個問題?

+0

@Conrad Frix:感謝您的編輯!順便說一句,你有一個非常酷的化身;)! – Chan 2011-04-25 16:34:52

回答

2

ISNUMERIC不保證它會成功投射到decimal

​​3210

此外,該case聲明的所有分支需要返回兼容的數據類型。它看起來像VRI.Square_Footage是一個字符串。

這是否適合您?

SELECT TOP 1000 CASE 
        WHEN ISNUMERIC(VRI.Square_Footage + 'e0') = 1 THEN 
        VRI.Square_Footage 
        WHEN VRI.Property_Type = 'LAND' 
         AND ISNUMERIC(VRI.Acres + 'e0') = 1 THEN CAST((
        CONVERT(NUMERIC(38, 3), VRI.Acres) * 43560) AS DECIMAL) 
        WHEN ISNUMERIC(VRI.Lot_Size + 'e0') = 1 THEN VRI.Lot_Size 
       END 
FROM View_Report_Information_Tables AS VRI 
+0

@Martin:謝謝。是的,'VRI.Square_Footage'實際上是'varchar'。我該如何解決這個問題? – Chan 2011-04-25 16:22:10

+1

這個。你不能在同一列中混合字符串和數字。其中一個必須轉換爲另一個。 – 2011-04-25 16:22:23

+0

@Jerry Ritcey:這意味着我必須將所有'varchar'轉換爲十進制? – Chan 2011-04-25 16:24:36

2

這裏運行這個

SELECT ISNUMERIC('d25') 

這可以轉換爲浮動,但不是小數/數字

SELECT CONVERT(FLOAT,'2d5') 

正如你所看到的,你不能依賴於數字的小數點/數字數據類型

看一下IsNumeric, IsInt, IsNumber的一些代碼,將告訴你如何檢查