Tsql 在转换为int的列上,将varchar转换为int失败
我创建了一个名为vReceivedEmail的视图,其中包括一个名为RowPrimaryKeyValue的varchar列。此列通常存储主键id值,例如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
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
尝试转换,所以今天学到了一些新东西。非常感谢。很好地理解了这个版本