检查数据是否违反SQL十进制约束

时间:2014-12-30 21:07:45

标签: sql sql-server sql-server-2008 sql-server-2005 decimal

我有一个表格会将列从VARCHAR更改为DECIMAL(20,7)数据类型。我需要找出哪些行在违反 DECIMAL(20,7)数据类型的列中有值,我相信我很接近。

到目前为止我所拥有的是:

SELECT * 
FROM tableName
WHERE 
     (ISNUMERIC(columnName)  = 0 and columnName IS NOT NULL)
     OR (columnName LIKE '%,%')
     OR (LEN(columnName) > 20)

我认为我大部分时间都在LEN支票上,因为我仍然可以错过结果。有没有办法更深入的长度,所以我可以精确检查,而不只是20?

的长度

3 个答案:

答案 0 :(得分:1)

您在评论中提及SQL Server 2012,对于2012或更高版本,请查看TRY_PARSE是否适合您。

declare @table table (Input varchar(50))

insert @table (Input) 
values ('20,000.0001'), ('abc'), ('1234'), ('0.12345678'), ('1234567891234.1234567')

select Input from @table
where 
    TRY_PARSE(Input as decimal(20,7)) <> TRY_PARSE(Input as decimal(21,8)) 
    or TRY_PARSE(Input as decimal(20,7)) is null

/*
   abc
   0.12345678
*/

答案 1 :(得分:0)

我建议您删除在许多情况下会失败的Isnumeric函数。而是添加Like运算符和另外一个条件。仍然可能存在一些空白。

SELECT *
FROM   tableName
WHERE  ( columnName LIKE '%[^.0-9]%'
         AND columnName IS NOT NULL )
        OR ( columnName LIKE '%,%' )
        OR (( columnName LIKE '%.%.%' ))
        OR ( Len(columnName) > 20 ) 

答案 2 :(得分:0)

这应该适合你。

SELECT * FROM [tablename] AS t
WHERE LEN([columnname]) > 21
OR LEN([columnname]) - CHARINDEX('.', [columnname]) > 7
相关问题