代码之家  ›  专栏  ›  技术社区  ›  Peter Kha

UNION导致“将varchar值转换为int时转换失败”

  •  7
  • Peter Kha  · 技术社区  · 10 年前

    我试图搜索以前与此相关的文章,但找不到与我的情况相关的文章。因为我是StackOverflow的新手,我不能发布图片,所以我会尝试描述它。

    我有两个数据集。一个是34行,共1列 NULL s、 其他13行,1列 varchar s

    当我试图 UNION ALL 这两者加在一起,我得到以下错误:

    将varchar值转换为数据类型int时转换失败。

    我不明白为什么会出现这种错误。我已经 UNION ed许多 无效的 列和 瓦尔查尔 在许多其他类型中,我没有遇到这种转换错误。

    有人能提出为什么会出现这种错误的建议吗?

    2 回复  |  直到 6 年前
        1
  •  15
  •   Gordon Linoff    10 年前

    出现错误是因为在两个子查询中有相应的列,其中一个子查询的类型是整数,另一个子查询类型是字符。然后,字符值在至少一行中具有不能自动转换为整数的值。

    这很容易复制:

    select t.*
    from (select 'A' as col union all
          select 1
         ) t;
    

    Here 是相应的SQL Fiddle。

    SQL Server使用相当复杂的类型优先级规则来确定 union 然而,在实践中,最好避免使用隐式类型转换。相反,将列显式转换为所需的类型。

    编辑:

    NULL 值是复杂的。 就其本身而言 这个 无效的 值没有类型。因此,以下操作正常:

    select NULL as col
    union all
    select 'A';
    

    如果键入 无效的 ,则查询将失败:

    select cast(NULL as int) as col
    union all
    select 'A';
    

    此外,如果将SQL Server置于必须分配类型的位置,则SQL Server将 无效的 整数。表或结果集中的每一列都需要一种类型,因此这也会失败:

    select (select NULL) as col
    union all
    select 'A';
    

    也许您的查询是这样做的。

        2
  •  0
  •   SimpleFixTech    3 年前

    当我在联合的2个SELECT查询中意外地将字段打乱顺序时,我也遇到了这个错误。调整字段顺序解决了问题。