我有一个表格会将列从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?
答案 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