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

在SQL中将varchar转换为int失败时,如何定位失败?,sql,sql-server-2008,Sql,Sql Server 2008,我有一列varchar50,我想用这行代码将其转换为int: ALTER TABLE [Table].[dbo].[example] ALTER COLUMN XYZ int 我查看了XYZ列的内容,它们看起来像从未超过9999的整数 我熟悉VisualStudio中的调试器,知道如何单步执行代码。但是,当我尝试使用SQL Server管理时。Studio调试器,我不知道如何调零并修复引发此错误的字段: 将varchar值“XYZ”转换为数据类型int时,转换失败 查询运行了大约1分钟,看起来

我有一列varchar50,我想用这行代码将其转换为int:

ALTER TABLE [Table].[dbo].[example]
ALTER COLUMN XYZ int
我查看了XYZ列的内容,它们看起来像从未超过9999的整数

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

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


查询运行了大约1分钟,看起来正常,但随后会弹出上述错误。

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

SELECT * 
FROM example 
WHERE xyz LIKE '%[^0-9]%'
当您更改表时,返回的记录将无法正确转换。存储在varchar字段中的小数也不会转换为整数

考虑:

选择将“1.1”转换为int-这将返回一个错误

祝您好运。

您可以在列中查找没有int值的行:

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

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

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

看。识别这些记录后,您可以确定如何继续使用ALTER TABLE

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

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

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


这将生成列XYZ为空的所有行,或者至少看起来是空的。如果它是空的,并且我试图转换为int,这是导致转换错误失败的原因吗?如何避免这种情况发生?@phan这是一个空字符串还是一个空格?我分不清区别。用我的眼球我只看到一个空牢房。我怎样才能分辨出区别呢?@phan Use lenxyz为零,那么它是空的吗?如果大于零,则有空白空格。Sok,现在将这样做。最后,我如何处理这两种情况,使其在从varchar50到int的转换中不会出现错误?请查看我的答案,并让我知道返回的内容。祝你好运。嗨,当我运行这个程序时,返回了两行,这些行只是复制了列标题。这让我很困惑,因为我不知道如何解释这一点,您所说的复制列标题是什么意思?XYZ列的数据完全是“XYZ”。第1行,在XYZ列中显示XYZ。行,在XYZ列中,它表示XYZ。然后这就是您的问题:-将它们更新为某个值-NULL或。无法将varchar值“XYZ”转换为整数。
select  xyz
from example
where isnumeric(xyz) <> 1
  or charindex('.', xyz) <> 0
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')