如何在SQL中将varchar转换为int失败时找到失败?

时间:2013-02-04 17:31:14

标签: sql sql-server-2008

我想使用以下代码行将varchar(50)列转换为int

ALTER TABLE [Table].[dbo].[example]
ALTER COLUMN XYZ int

我看到了列XYZ的内容,它们看起来像是从不超过9999的整数。

我熟悉Visual Studio中的调试器,并且知道如何单步执行代码。但是,当我尝试使用SQL Server Mgmt时。 Studio调试器,我不知道如何归零并修复抛出此错误的字段:

  

将varchar值'XYZ'转换为数据类型int时转换失败。

查询运行大约1分钟,似乎有效,但随后弹出上述错误。

3 个答案:

答案 0 :(得分:3)

您可以使用正则表达式来确定哪些字段无法正确转换。

SELECT * 
FROM example 
WHERE xyz LIKE '%[^0-9]%'

当您更改表格时,记录返回是不能正确CAST的记录。存储在varchar字段中的小数也不会转换为整数。

考虑一下:

select CAST('1.1' as int) - 这会返回错误。

祝你好运。

答案 1 :(得分:1)

您使用IsNumeric()查找列中没有int值的行:

select *
from example
where isnumeric(xyz) <> 1

请参阅SQL Fiddle with Demo

您也可以使用CASE声明:

select 
  case 
    when isnumeric(xyz) <> 1 
    then xyz end
from example
where isnumeric(xyz) <> 1

请参阅SQL Fiddle with Demo

如果您想查找可能包含句点的记录,因此它们不是int值,那么您可以使用:

select  xyz
from example
where isnumeric(xyz) <> 1
  or charindex('.', xyz) <> 0

SQL Fiddle with Demo。确定这些记录后,您可以确定如何继续ALTER TABLE

答案 2 :(得分:1)

确保值的唯一方法是使用SQL Server 2012中的Try_Cast/Try_Parse函数或早期SQL Server版本中的Try Catch模式。

Isnumeric函数在这里几乎没有价值,因为正如你所看到的,如果你运行下面的语句,它将为显示的值返回1(true)......然后是值无法转换或转换为任何数字数据类型。

使用正则表达式"NOT LIKE '%[^0-9]%' "来测试您的值将消除字符串中非数字字符的问题。但是,它不能保证可以将值转换为给定的数据类型。例如,"999999999"是一个有效的整数,但如果将其强制转换为smallint,则会导致溢出错误。

Ex1
Select Isnumeric('$123,456.00')
--Select Cast( '$123,456.00' as int)
--Select Cast( '$123,456.00' as numeric(6,2))
--Select Cast( '$123,456.00' as decimal(6,2))
--Select Convert(int, '$123,456.00')
--Select Convert(numeric(6,2), '$123,456.00')
Select Convert(decimal(6,2), '$123,456.00')