将转换失败varchar转换为转换为int的列上的int

时间:2017-06-19 16:09:47

标签: tsql sql-server-2012 ssms-2012

我创建了一个名为 vReceivedEmail 的视图,其中包含一个名为 RowPrimaryKeyValue 的varchar列。此列通常存储主键ID值,例如567781,但不时会有描述性文本“Ad hoc message”。

我已将视图设置为只显示包含主键值的记录,然后CAST列显示为int

SELECT      CAST(Email.RowPrimaryKeyValue as int)           as DetailID
FROM        MessageStore.dbo.Email Email
WHERE       ISNUMERIC(Email.RowPrimaryKeyValue) = 1

当我测试视图时,我只获得具有我期望的主键值的记录,当我在对象资源管理器中查看视图的列列表时,该列将保存在int数据类型中

然后我尝试在单独的查询中应用以下WHERE子句,引用我保存的视图:

SELECT      PotAcc.DetailID
FROM        PotentialAccounts PotAcc
WHERE       PotAcc.DetailID NOT IN (
                SELECT      RecEmail.DetailID
                FROM        vReceivedEmail  RecEmail
            )

...但我回复了以下错误:

  

转换varchar值'Ad hoc消息'时转换失败   数据类型int。

'Ad hoc message'是来自我过滤并转换为int的列的数据,但我不知道它是如何设法在此处绊倒的,因为视图将explcitly过滤掉并将列转换为int。

2 个答案:

答案 0 :(得分:4)

由于您使用的是SQL Server 2012,如何使用try_convert(int,RowPrimaryKeyValue) is not null代替isnumeric()

您的观点如下:

select try_convert(int, RowPrimaryKeyValue) as DetailID
from MessageStore.dbo.Email Email
where try_convert(int, RowPrimaryKeyValue) is not null

在SQL Server 2012及更高版本中:当转换失败而不是错误时,其中每个都会返回null

答案 1 :(得分:2)

Isnumeric()可能会欺骗......但是我打赌这是由于SQL Server优化。虽然您的视图有效,但这并不意味着外部查询保证只返回INT。而不是使用视图...使用CTE并尝试它。因为你是在2012年,所以这一切都可以避免SqlZim如上所述。

WITH CTE AS(
SELECT      CAST(Email.RowPrimaryKeyValue as int)           as DetailID
FROM        MessageStore.dbo.Email Email
WHERE       ISNUMERIC(Email.RowPrimaryKeyValue) = 1)


SELECT      PotAcc.DetailID
FROM        PotentialAccounts PotAcc
WHERE       PotAcc.DetailID NOT IN (
                SELECT      RecEmail.DetailID
                FROM        CTE RecEmail
            )