Tsql 在转换为int的列上,将varchar转换为int失败

Tsql 在转换为int的列上,将varchar转换为int失败,tsql,sql-server-2012,ssms-2012,Tsql,Sql Server 2012,Ssms 2012,我创建了一个名为vReceivedEmail的视图,其中包括一个名为RowPrimaryKeyValue的varchar列。此列通常存储主键id值,例如567781,但偶尔会有描述性文本“即席消息” 我将视图设置为只显示包含主键值的记录,然后将列转换为int SELECT CAST(Email.RowPrimaryKeyValue as int) as DetailID FROM MessageStore.dbo.Email Email WHERE

我创建了一个名为vReceivedEmail的视图,其中包括一个名为RowPrimaryKeyValue的varchar列。此列通常存储主键id值,例如
567781
,但偶尔会有描述性文本“即席消息”

我将视图设置为只显示包含主键值的记录,然后将列转换为
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值“即席消息”时转换失败 到数据类型int

“即席消息”是我过滤并转换为int的列中的数据,但我不知道它是如何在这个问题上出错的,因为视图会明确地过滤掉这些数据,并将列转换为int。

可能是欺骗。。。然而,我打赌这是由于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
            )

既然您使用的是SQL Server 2012,那么使用
try\u 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


不错。以前没有使用过
尝试转换
,所以今天学到了一些新东西。非常感谢。很好地理解了这个版本