我试图搜索以前与此相关的文章,但我找不到一个特定于我的情况。因为我是StackOverflow的新手,所以我无法发布图片,所以我会尝试描述它。
我有两个数据集。一个是34行,所有NULL
的列都是1列。其他13行,1列varchar
s。
当我尝试UNION ALL
这两个一起时,我收到以下错误:
将varchar值转换为数据类型int时转换失败。
我不明白为什么我收到这个错误。我之前UNION
列了许多NULL
列和varchar
列,其中包括许多其他类型,我没有收到此转换错误。
有人可以提出为什么会出现此错误的建议吗?
答案 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';
也许您的查询正在做这样的事情。