繁体   English   中英

在SQL中将varchar转换为int的失败中,如何定位失败?

[英]How do I locate the failure in a failure to convert varchar to int in SQL?

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

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

我盯着XYZ列的内容,它们看起来像是永远不超过9999的整数。

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

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

该查询运行了大约1分钟,似乎可以正常工作,但随后弹出了上述错误。

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

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

返回的记录是当您更改表时将无法正确投射的记录。 存储在varchar字段中的小数也不会转换为整数。

考虑:

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

祝好运。

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

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

参见带有演示的SQL Fiddle

您还可以使用CASE语句:

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

参见带有演示的SQL Fiddle

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

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

请参阅带有演示的SQL Fiddle 一旦识别了这些记录,就可以确定如何继续使用ALTER TABLE

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

在这里, Isnumeric函数几乎没有值,因为,如您所见,如果运行下面的语句,它将为显示的值返回1(true)……而该值不能转换或转换为任何数字数据类型。

使用正则表达式"NOT LIKE '%[^0-9]%' "来测试您的值将消除字符串中非数字字符的问题。 但是,不能保证该值可以强制转换为给定的数据类型。 例如, "999999999"是有效的整数,但是如果将其smallint转换为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')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM