回答

收藏

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

技术问答 技术问答 103 人阅读 | 0 人回复 | 2023-09-12

我试图搜索以前的文章,但我找不到适合我情况的文章。因为我是StackOverflow新手,所以我不能发布图片,所以我会试着描述它。0 a5 Z/ J  B; T, x2 B5 O
我有两个数据集。一个是34行,占所有NULLs1列。其他13行,其中1列为varchars。
6 c1 j) b, R0 x5 t; T+ J# V同时试试UNION ALL这两个时候,出现了以下错误:1 n2 }6 d) D# p/ \1 t# T; W- F
将varchar值转换为int在数据类型中,转换失败。
( i- @& _; K/ \0 z& p5 T
我不明白为什么会收到这个错误。UNION编辑过许多NULL列和varchar许多其他类型的列,但没有得到这种转换错误。* T& A0 U% f% W6 b
为什么会出现这个错误,谁能提出建议?
, |/ u! t6 a4 c                                                                0 Z/ |- U( n4 e; U; |
    解决方案:                                                                , O# q) t1 ?0 f+ j  l
                                                                错误是因为你在两个子查询中都有相应的列,一个是整数,另一个是字符。然后,字符值至少有一个值不能自动转换为整数。
& r, x5 [  S. Z4 _$ F9 W易于复制:
2 D! ^( O! D0 |2 }select t.*from (select 'A' as col union all      select 1     ) t;这是相应的SQL Fiddle。  H9 S' G, g/ D) |2 R
SQL
# _( x+ W& Y6 V6 P/ f- \" {Server使用相当复杂的类型优先级规则来确定.NET目标类型union。但实际上,最好避免使用隐式类型转换。而是将列显式转换为所需类型。% k) l: ]- B8 l1 y* J) i1 y
编辑:
/ L0 H0 y# X; T* x& u有NULL价值观非常复杂。就其本身而言    ,该NULL值没有类型。因此,以下工作正常:. Y: d( V/ l, u" g- u4 }
select NULL as colunion allselect 'A';如果键入NULL,查询失败:
7 K- s; t/ M8 ]: e+ m$ Z1 ?select cast(NULL as int) as colunion allselect 'A';另外,如果将SQL Server放置在必须分配类型的位置,SQL
1 U- o2 w- v6 f9 T7 E. B/ |Server将使该NULL整数成为整数。表或结果集中的每一列都需要一种类型,因此也会失败:
( W5 |( M2 ]$ t0 x* r: Jselect (select NULL) as colunion allselect 'A';也许你的查询正在做这样的事情。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则