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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM