Sql server 2008 r2 转换/强制转换错误,NVARCHAR到INT
我正在使用SQLServer2008R2。我有两个表,第一个是属性表。第二个有一列引用attributes表。这两个表使用varchar32列连接 此示例适用于:Sql server 2008 r2 转换/强制转换错误,NVARCHAR到INT,sql-server-2008-r2,type-conversion,Sql Server 2008 R2,Type Conversion,我正在使用SQLServer2008R2。我有两个表,第一个是属性表。第二个有一列引用attributes表。这两个表使用varchar32列连接 此示例适用于: attrib int_val -------------------------------- ----------- x 323 y 615 但是,当我对具
attrib int_val
-------------------------------- -----------
x 323
y 615
但是,当我对具有数千条记录的生产表运行相同的查询时,我得到一个错误:将nvarchar值“vase”转换为数据类型int时,转换失败
如果从生产查询中删除强制转换,则可以看到val列返回的数据仅包含整数值
为什么SQL Server尝试转换不属于返回数据集的值?更奇怪的是,如果我在选择列表中除了casta.val作为int之外还包含了a.val,那么就没有转换错误。以前有人见过这个吗?这只是SQL Server中的一个bug吗
顺便说一句,使用convertint,a.val与casta.val的问题与int相同。我认为这与您的问题有关。请检查已接受的答案。这不是一个SQL Server错误。这是因为操作的顺序不是程序性的,这对大多数人来说不是很明显
希望这能有所帮助。使用上述给定数据,您应该不会得到匹配的行。如果将第二个表插入更改为插入tblB值“vase”,“bottom”-则会正确引发错误。抱歉-在发布问题之前,我调整了示例。没有注意到“top”和“bottom”仍在tblB中插入。我的意思是使用“x”和“y”。我不太清楚为什么会出现这种情况,但可能存在与非数字数据匹配的行。例如,某些数据可能具有不显示的特殊字符,或者某些前导空格或空值。另一种可能是匹配行中的值超过int限制。我想你可以很容易地很快核实这两个案例。已经核实了所有这些。今天的工作方式是,我做了一个选择。。。进入temp,然后选择…,casta.val作为int from temp,这是有效的。因此,如果我先将值推送到临时表,然后进行转换,那么这些值将正确转换。所以所有的数据都是有效的。出于某种原因,SQL Server只是尝试转换未返回的行。对我来说,这似乎是SQL Server中的一个bug,但我想我会在这里发布这个问题,看看有没有人看到了这一点,并知道为什么……这真的很有帮助。这正是我想要的。非常感谢。
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