case when 遇到varchar转为int类型值失败的错误

时间:2023-12-31 11:19:50

问题描述:

在Sql Server 2005下,

使用如下语句报错:在将 varchar 值 '大' 转换成数据类型 int 时失败。

注:status 是整型字段

select ff=  case when status>'6' then '大'   when status='3' then '小'  else    status     end from member

问题解决:

select ff=  case when status>'6' then '大'   when status='3' then '小'  else   CAST(status AS varchar(11))   end from member

原因:

在Sql Server 2005中,如果分支结果有int类型,默认结果是以int优先级高,所有分支结果都会自动转成int类型,status这个字段(可能是int类型),因此在返回的结果里把int类型都转成字符串类型,问题即可解决。

如果不转化,当status>'6'时,就会把'大'默认自动转换成优先级高的int类型,所以会报错。

它显示出,SQL Server试图把“Speedy Express”(nvarchar数据类型转换成一个整数——当然,这个操作是不可能成功的。出现错误的原因于,按照“数据类型优先级”规则,CASE表示式中最高优先级的数据类型决定了表达式返回数据类型。“数据类型优先级”规则可以SQL Server Books Online(BOL)找到,它规定了int数据类型的优先级要比nvarchar数据类型高。前面的代码要求SQL Server按照CompanyName排序输出,CompanyName是nvarchar数据类型。这个CASE表达式的返回可能是ShipperID(int类型),可能是CompanyName(nvarchar类型),或Phone(nvarchar类型)。由于int类型具有较高的优先级,因此CASE表达式返回数据类型应该是int。

为了避免出现这种转换错误,我们可以尝试把ShipperID转换成varchar数据类型。采用这种方法之后,nvarchar作为最高优先级的数据类型被返回。Listing 3显示了修改后的GetSortedShippers存储过程。

文章出处:http://www.itkeyword.com/doc/8295956035150524542/SQL-Cache-SQL-Server