我创建了一个名为 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。
答案 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
)