0

我正在使用 SQLServer 2008 R2。我有两个表,第一个是属性表。第二个有一个引用属性表的列。这两个表使用varchar(32)列连接。

#tblA                              #tblB
---------------------              ---------------------
attrib varchar(32)    <--------->  attrib varchar(32)
val nvarchar(255)                  [other fields]
[other fields]

查询连接表并转换#tblA.valint

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).

4

1 回答 1

0

我认为这与您的问题有关。请检查接受的答案。这不是 SQL Server 错误。这是因为操作的顺序不是程序化的(这对大多数人来说不是很明显)。

SQL Server Join 中的强制转换顺序

希望这可以帮助。

于 2013-10-18T21:57:27.817 回答