【问题标题】:Why does this cast work in one statement and not another?为什么这个演员表在一个陈述而不是另一个陈述中起作用?
【发布时间】:2013-05-11 00:20:27
【问题描述】:

这两个查询工作正常:

select cast(sku as bigint) from bid                 
select cast(sku as bigint) from vwbidrecords       

此查询失败并显示消息“将数据类型 varchar 转换为 bigint 时出错。”

select * from bid where cast(sku as bigint) in  
(select cast(sku as bigint) from vwbidrecords)

任何人都知道为什么即使第一个两个很好,第三个也不起作用?

【问题讨论】:

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

标签: sql sql-server-2008 casting


【解决方案1】:

您正在使用一个视图,我猜它必须涉及一些多表 JOIN(将视图过滤为仅数字 SKU)或至少一个带有 WHERE 子句的表。

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

查看这个错误SQL Server should not raise illogical errors,它解释了原因

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

将在您最不期望的时候提出。事实上

select cast(sku as bigint) from vwbidrecords

on its own works只意味着它与查询3的优化不同。检查两个执行计划,它会变得更清晰。

【讨论】:

    猜你喜欢
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多