Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 r2 转换/强制转换错误,NVARCHAR到INT_Sql Server 2008 R2_Type Conversion - Fatal编程技术网

Sql server 2008 r2 转换/强制转换错误,NVARCHAR到INT

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 但是,当我对具

我正在使用SQLServer2008R2。我有两个表,第一个是属性表。第二个有一列引用attributes表。这两个表使用varchar32列连接

此示例适用于:

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