我正在使用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
但是,当我对包含数千条记录的生产表运行相同的查询时,我收到错误:转换nvarchar值时转换失败&#39;花瓶&#39;数据类型为int。
如果我从生产查询中删除cast()
,我可以看到列val
的返回数据只包含整数值。
为什么SQL Server会尝试转换不属于返回数据集的值?更奇怪的是,除了a.val
之外,如果我在选择列表中包含cast(a.val as int)
,则没有转换错误。谁看过这个吗?它只是SQL Server中的一个错误吗?
BTW - 使用convert(int, a.val)
与cast(a.val as int)
存在同样的问题。
答案 0 :(得分:0)
我认为这与您的问题有关。请检查接受的答案。它不是SQL Server错误。这是因为操作顺序不是程序性的(对大多数人来说这不是很明显)。
希望这有帮助。