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

检测列中导致SQL错误的单元格,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,假设我们正在尝试使用:alter table更改SQL表中列的类型,例如从varchar更改为float,您可以使用ISNUMERIC函数: select * from table where isnumeric(mycolumn) = 0 如果在列中允许空值,还需要添加空值检查,因为ISNUMERICNULL的计算结果也是0 select * from table where isnumeric(mycolumn) = 0 or mycolumn is not null 我在编写ETL过程

假设我们正在尝试使用:alter table更改SQL表中列的类型,例如从varchar更改为float,您可以使用ISNUMERIC函数:

select * from table where isnumeric(mycolumn) = 0
如果在列中允许空值,还需要添加空值检查,因为ISNUMERICNULL的计算结果也是0

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

我在编写ETL过程时遇到了同样的问题。将暂存数据移动到实际的核心表中,我们将暂存表上的所有列都设置为NVARCHAR。 可能有一个数值,它要么是科学格式,比如Excel单元格中的非常大的浮点值,要么就是其中有一个特殊字符。当此字符显示为整数值时,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

肮脏,但有效。这将删除浮动和小数中的所有字符-我以美国为中心。您从查询中得到的结果是需要检查的项目,以确定应该做什么,即导致您出现问题的单元格

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

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

SELECT col
FROM   tab
WHERE  col LIKE '%[^0-9.]%'
以及可能有多个句点的任何行:

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

谢谢你的回答。但是因为我的列是varchar,所以您的查询将返回我的整个列!它应该只返回列无法成功转换为数值的行。尝试以下操作:选择isnumeric“0”,尽管它是varchar,但应该返回1。它仍然返回我的整个列。。这很奇怪,因为我的专栏基本上都是数值。我不明白为什么SQL很难将其转换为浮点。你能使用www.sqlfiddle.com提供一些示例数据吗?无法正确转换的实际数据?我从未使用sqlfiddle上传实际数据,但是我会看看我能做些什么来给你一个快照。你能解释一下这是怎么做的吗?所以这只会从列中的每个单元格中提取所有非数字字符。那么我该怎么做呢?此查询将提取诸如-或E-之类的字符,但这并不意味着包含这些字符的数字不能转换为浮点。您必须查看数据,并查看它需要如何清理。