問題描述:
在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