检测列中导致SQL错误的单元格

时间:2013-10-01 13:35:58

标签: sql sql-server sql-server-2005

假设我们尝试使用:varchar来改变SQL表中列的类型,例如从floatALTER TABLE <mytable. ALTER COLUMN <mycolumn> FLOAT。但是,我们收到错误Error to convert datatype varchar to float

是否可以缩小列中导致此问题的单元格?

谢谢,

4 个答案:

答案 0 :(得分:3)

您可以使用ISNUMERIC功能:

select * from table where isnumeric(mycolumn) = 0

如果在列中允许NULL值,则还需要添加NULL检查,因为ISNUMERIC(NULL)的计算结果为0

select * from table where isnumeric(mycolumn) = 0 or mycolumn is not null

答案 1 :(得分:0)

我在编写ETL过程时遇到了同样的问题。将登台数据移动到实际的核心表中,我们将登台表上的所有列都放入NVARCHAR。 可能有一个数值,它是科学格式(如Excel单元格中非常大的浮点值),或者它有一个特殊的CHAR。当ISNUMERIC函数显示为整个值时,它将此char计算为True。 例如

    SELECT ISUMERIC('$'), ISNUMERIC('.')

所以只需检查该列中的任何单元格是否具有此类值。

    '$'
    '-'
    '+'
    ','
    '.'

如果您发现该单元格中包含上述单元格之一,则只需在查询中排除此类数据。 如果您发现您拥有科学格式的数据,如“1.2408E + 12”,那么ISNUMERIC仍会将其评估为TRUE,但直接插入将失败,因此请以适当的数字格式进行转换。

    DECLARE @t NUMERIC(28,10)
    SELECT @t=CONVERT(NUMERIC(28,10),CONVERT(FLOAT,'1.2408E+12'))
    SELECT @t

答案 2 :(得分:0)

肮脏但有效。这将删除在浮点数中找到的所有字符(#s和十进制 - 我是以美国为中心的)。从查询中获得的结果是需要检查以确定应该执行的操作的项目(即导致问题的单元格)。

SELECT
    *
FROM (
    SELECT
            TableId
        ,   REPLACE(
            REPLACE(
            REPLACE(
            REPLACE(
            REPLACE(
            REPLACE(
            REPLACE(
            REPLACE(
            REPLACE(
            REPLACE(
            REPLACE(
                ISNULL(Col1,'')
            ,'0','')
            ,'1','')
            ,'2','')
            ,'3','')
            ,'4','')
            ,'5','')
            ,'6','')
            ,'7','')
            ,'8','')
            ,'9','')
            ,'.','') [FilteredCol1]
    FROM Table
) a
WHERE len(a.[FilteredCol1])>0

答案 3 :(得分:0)

选择varchar值包含任何非数字字符的任何记录

SELECT col
FROM   tab
WHERE  col LIKE '%[^0-9.]%'

以及可能包含多个句点的所有行:

SELECT col
FROM   tab
WHERE  col LIKE '%.%.%'