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

时间:2014-08-18 22:43:54

标签: sql sql-server null union varchar

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

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

当我尝试UNION ALL这两个一起时,我收到以下错误:

  

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

我不明白为什么我收到这个错误。我之前UNION列了许多NULL列和varchar列,其中包括许多其他类型,我没有收到此转换错误。

有人可以提出为什么会出现此错误的建议吗?

1 个答案:

答案 0 :(得分:13)

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

这很容易复制:

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

Here是相应的SQL小提琴。

SQL Server使用相当复杂的类型优先级规则来确定union中的目标类型。但实际上,最好避免使用隐式类型转换。相反,显式地将列转换为您想要的类型。

编辑:

NULL值的情况很复杂。 本身NULL值没有类型。所以,以下工作正常:

select NULL as col
union all
select 'A';

如果您输入NULL,则查询将失败:

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

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

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

也许您的查询正在做这样的事情。