2011-04-25 110 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的一些代码,将告诉你如何检查