Sql 为什么这组演员在一种陈述中有效,而在另一种陈述中无效?

Sql 为什么这组演员在一种陈述中有效,而在另一种陈述中无效?,sql,sql-server-2008,casting,Sql,Sql Server 2008,Casting,这两个查询工作正常: select cast(sku as bigint) from bid select cast(sku as bigint) from vwbidrecords 此查询失败,并显示消息“将数据类型varchar转换为bigint时出错。” 对任何人来说,即使前两个很好,为什么第三个也不起作用,这有意义吗?您使用的是一个视图,我猜它必须涉及一些多表联接(只将视图过滤为数字SKU),或者至少是一个带有WHERE子句的表 它也很可

这两个查询工作正常:

select cast(sku as bigint) from bid                 
select cast(sku as bigint) from vwbidrecords       
此查询失败,并显示消息“将数据类型varchar转换为bigint时出错。”


对任何人来说,即使前两个很好,为什么第三个也不起作用,这有意义吗?

您使用的是一个视图,我猜它必须涉及一些多表联接(只将视图过滤为数字SKU),或者至少是一个带有WHERE子句的表

它也很可能在视图查询中涉及一些ISNUMERIC测试

看看这个bug,它解释了为什么

将数据类型varchar转换为bigint时出错

select * from bid where cast(sku as bigint) in  
(select cast(sku as bigint) from vwbidrecords)
会在你最不经意的时候被提起。事实是

select cast(sku as bigint) from vwbidrecords

就其本身而言,这只意味着它的优化方式与查询3不同。检查两个执行计划,它会变得更清晰。

每个表中
sku
字段的数据类型是什么?(这并不重要)乍一看不重要。但是,当您可以直接比较sku和bigint时,将sku转换为bigint也没有意义,而且使用这样的IN子句而不是内部联接也没有意义。不评判;只是说,前两个查询是否真的如图所示工作,即针对表中的每一行?是否可以用重新创建问题?可以从代码推断,列sku的类型为varchar。在这种情况下,没有任何意义,除非sku中有一些元组无法转换为bigint,在这种情况下,前两个查询中的任何一个都必须失败。