我正在使用 SQLServer 2008 R2。我有两个表,第一个是属性表。第二个有一个引用属性表的列。这两个表使用varchar(32)
列连接。
#tblA #tblB
--------------------- ---------------------
attrib varchar(32) <---------> attrib varchar(32)
val nvarchar(255) [other fields]
[other fields]
查询连接表并转换#tblA.val
为int
:
create table #tblA (attrib varchar(32), val nvarchar(255) /*, other fields */)
insert into #tblA values ('vase', 'red'), ('x', '323'), ('y', '615')
create table #tblB (attrib varchar(32) /*, other fields */)
insert into #tblB values ('x'), ('y')
select b.*, cast(a.val as int) as int_val
from #tblA a inner join #tblB b on a.attrib = b.attrib
drop table #tblB, #tblA
这个例子有效:
attrib int_val
-------------------------------- -----------
x 323
y 615
但是,当我对包含数千条记录的生产表运行相同的查询时,出现错误:Conversion failed when converting the nvarchar value 'vase' to data type int.
如果我cast()
从生产查询中删除 ,我可以看到列的返回数据val
仅包含整数值。
为什么 SQL Server 会尝试转换不属于返回数据集的值?更奇怪的是,如果我a.val
在选择列表中除了 之外cast(a.val as int)
,也没有转换错误。有没有人见过这个?它只是 SQL Server 中的一个错误吗?
顺便说一句-使用convert(int, a.val)
与cast(a.val as int)
.