標籤:convert cast 查詢中資料類型
SQLServer---查詢過程中的資料類型轉化
前兩天在維護某市人才服務中心的人事檔案管理系統的時候,發現了這個一個問題新的檔案編號規則是日期+已有檔案最大編號+1(六位,不足六位在中間補零)(((CONVERT([varchar](9),[createTime],(112))+‘‘)+right((100000000000.)+[num],(6))))例如:20150511007841。說實話真的不清楚當時為什麼會用最大編號,而不是用總記錄數+1(不存在刪除資料),接下來說說遇到的問題,以及解決方案吧。
問題再現
查詢表中總記錄數+1
select count(number)+1 from T_UniversityStudent
執行結果
查詢表中最大資料+1
select MAX(number)+1fromT_UniversityStudent
執行結果
問題原因
為什麼明明資料庫中有了7840條資料,而資料記錄是每次加1,那為什麼會造成這中問題呢?
我想有經驗的開發人員,已經知道了,是不是資料類型有問題了。在字串的大小比較中9>1000是成立的,也就是說999>7840也是正確的。
我們通過排序來驗證是否上述的說法是正確的
select number from T_UniversityStudentorderbynumber asc
執行結果
問題解決
既然我們已經知道了是欄位設計的過程中存在問題,那麼我們最簡單的就是講欄位的資料類型改了,但由於我們不瞭解修改資料類型之後會不會造成不良的後果,因此這種方法並不是最好的。
這時我們就能用到cast函數和convert函數了。
具體的用法如下
通過將varchar類型轉化成int類型排序(使用convert函數)
select number from T_UniversityStudentorderbyconvert(int,number)asc
執行結果
將查詢欄位中的varchar轉換成int
select MAX(cast(numberasint))+1fromT_UniversityStudent
執行結果
需要注意的是convert函數只能運用在SQLServer中而cast函數可以用在oracle和SQL Server中,至於其他資料庫中是否支援還需要讀者自己嘗試了。
SQLServer---查詢過程中的資料類型轉化