2

我有一列varchar(50)要转换为int使用这行代码:

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

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

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

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

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

4

3 回答 3

4

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

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

返回的记录是在您 ALTER 表时无法正确 CAST 的记录。存储在 varchar 字段中的小数也不会转换为整数。

考虑:

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

祝你好运。

于 2013-02-04T17:33:01.640 回答
1

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 with Demo。一旦您识别出这些记录,您就可以确定如何处理ALTER TABLE

于 2013-02-04T17:33:25.313 回答
1

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

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')
于 2013-09-04T21:05:41.827 回答