3

假设我们正在尝试更改 SQL 表中列的类型,例如 fromvarcharfloat,使用:ALTER TABLE <mytable. ALTER COLUMN <mycolumn> FLOAT。但是,我们得到了错误Error to convert datatype varchar to float

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

谢谢,

4

4 回答 4

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
于 2013-10-01T13:38:33.443 回答
0

我在编写 ETL 过程时遇到了同样的问题。将暂存数据移动到实际的核心表中,并且我们在暂存表上的所有列都是 NVARCHAR。可能有一个数值,它要么是科学格式(如 Excel 单元格中的非常大的浮点值),要么其中包含一个特殊的 CHAR。ISNUMERIC 函数将此字符评估为 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
于 2013-10-01T14:49:02.357 回答
0

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

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

以及任何可能有多个句点的行:

SELECT col
FROM   tab
WHERE  col LIKE '%.%.%'
于 2013-10-01T15:31:24.833 回答
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
于 2013-10-01T14:57:02.223 回答