Sql server SQL Server-将无效值强制转换为int

Sql server SQL Server-将无效值强制转换为int,sql-server,tsql,casting,Sql Server,Tsql,Casting,如果输入数据损坏,有没有办法处理SQL强制转换 假设我有一个数据类型为NVarchar(10)的列,并希望将此列强制转换为int 我们还可以说,一些nvarchar值已损坏,因此无法转换为int 是否有任何方法可以默默地忽略它们,将它们默认为0或类似的值?使用PatIndex()函数尝试此操作: select id, val from t where patindex('%[^0-9]%',val) = 0 注意:上面的查询正在过滤掉损坏的值,如果您需要将它们与0值一起引入,请使用大小写表达

如果输入数据损坏,有没有办法处理SQL强制转换

假设我有一个数据类型为
NVarchar(10)
的列,并希望将此列强制转换为
int

我们还可以说,一些
nvarchar
值已损坏,因此无法转换为
int


是否有任何方法可以默默地忽略它们,将它们默认为0或类似的值?

使用
PatIndex()函数尝试此操作:

select id, val
from t
where  patindex('%[^0-9]%',val) = 0
注意:上面的查询正在过滤掉损坏的值,如果您需要将它们与0值一起引入,请使用
大小写表达式,如下所示

select id, case when patindex('%[^0-9]%',val) = 0 
                then convert(int, val) 
           else 0 end val
from t 

ISNUMERIC函数为整数值时返回1,您可以使用此函数

结果

Number
NULL
30
100
NULL
200
NULL

它会将
整数值转换为INT,并忽略无法转换为INT的值

我将是不受欢迎的一个,并建议
正则表达式
,因为
是数值的
,虽然有时有用,但并不能捕获所有内容。出色地介绍了一些正则表达式概念,例如:

一个数字

Number
NULL
30
100
NULL
200
NULL
可能是其中最简单的一个:

WHERE Column LIKE '[0-9]'

有关更多详细信息,请参阅Phil Factor和Robyn Pae的文章。

SQL Server 2012现在有了
TRY\u PARSE
TRY\u CAST
TRY\u CONVERT
函数,它们完全满足您的需求。但这些都是2012年(及更高版本)才有的。有什么退路吗?e、 g.以某种方式匹配numeric first的大小写?
Isnumeric()
函数将不起作用,因为它将为非数字的某些其他字符返回true。这里有一个and链接,可以了解更多详细信息
ISNUMERIC
,因为大多数情况下它是有用的,但是请记住,某些值不会被函数捕获。有时,在中间,你会得到一个带有<代码> e <代码>的值,即使我们不想要那些值。YEP,我要提到的是,如果你的值中有<代码> E <代码>,它就把它看作是它左边的整数的幂。code>222e2
被视为222^2它不仅仅是
e
,请它有
$1
,并且仍然
是数值的()
返回
真的