zoukankan      html  css  js  c++  java
  • case when 遇到varchar转为int类型值失败的错误

    问题描述:

    在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

  • 相关阅读:
    次小生成树
    乘法逆元(递推)
    乘法逆元(快速幂)
    带偏移量的并查集
    Tarjan 强连通分量
    Luogu_P2461 [SDOI2008]递归数列 【题解】 矩阵乘法
    Luogu_P2243 电路维修【题解】 双端队列bfs
    Luogu_ P2962 [USACO09NOV] 灯 【题解】 双向搜索
    luogu_P2044【题解】 随机数生成器 矩阵乘法
    luogu_P2054 bzoj 1965 洗牌 【题解】 快速幂 快速乘
  • 原文地址:https://www.cnblogs.com/net-sky/p/9017113.html
Copyright © 2011-2022 走看看