为什么TestID没有转换为INT?

时间:2014-08-29 13:42:25

标签: tsql sql-server-2008-r2

开发人员和DBA,我想我在SQL 2008 R2中找到了一个错误,除非你们其中一个人能够解释下面的内容。 在这种情况下,您能否解释一下为什么TestID被转换为NUMERIC而不是INT? 请注意,这只是一个示例,向您展示我在尝试更大的时候遇到的问题,例如自动化脚本,它将从Excel或Notepad导入的数据转换为适当的数据类型,int,numeric ,datetime,varchar。

CREATE TABLE #CorruptData(
TestID VARCHAR(100)
 );

 GO

INSERT INTO #CorruptData
VALUES ('1'),
   ('2');



SELECT 
     CASE
        WHEN TestID LIKE '[1-9]%' AND TestID NOT LIKE '0%' THEN CAST(TestID AS INT) 
        WHEN TestID LIKE '0%'  THEN CAST(TestID AS NUMERIC(12,2))
   END AS TestID


 INTO #FixedData
 FROM #CorruptData


SELECT  *
FROM    #FixedData

2 个答案:

答案 0 :(得分:1)

由于CASE语句返回类型的方式,您的1和2被转换为十进制:

  

CASE

     

结果类型从类型集中返回最高优先级类型   在result_expressions和可选的else_result_expression中。对于   更多信息,请参阅数据类型优先级。

阅读完整文档:http://technet.microsoft.com/en-us/library/ms181765(v=sql.105).aspx

如果你真的想看到INT,那么只需将从CASE语句返回的内容转换为INT:

CAST(CASE
    WHEN TestID LIKE '[1-9]%' AND TestID NOT LIKE '0%' THEN CAST(TestID AS INT) 
    WHEN TestID LIKE '0%'  THEN CAST(TestID AS NUMERIC(12,2))
END AS INT) AS TestID

答案 1 :(得分:0)

Ususaly当您处理不正确或损坏的数据时,您应该尽可能减少对它的假设,并且让正在审查和更改此类数据的用户决定它是什么。

同样@Louie Bao说,你不能在两种或更多种数据类型中使用相同的列。您只需要选择一个。由于需要保留数值,因此列应为NUMERIC []。

所以你的选择是:

  • 将其保留为VARCHAR
  • 将数据放入两个不同的列INTNumeric[]
  • 有一个单NUMERIC列,但出于显示目的,将没有小数部分的数字转换为VARCHAR(),看起来是整数。