坑人的SQL Server檢測數字類型的函數ISNUMERIC


前幾天,遇到一個十分棘手的問題,有同事提出在是字符類型的列中進行起止號計算,大體是這樣的

新起號=上一條止號+1

新止號=新起號+數量

而在這一列的數據是這樣的

庫存

CN003?005007

000890670000

98111100 庫存

370111900000

001,800,900,00

~~~~~~~~~~~~

木辦法,問度娘吧,發現還是高人多啊,提出用ISNUMERIC(列名)=1,就是數字類型的,但是請看一下ISNUMERIC的說明文檔

ISNUMERIC

 

語法   ISNUMERIC ( expression )
參數 expression  要計算的表達式。
返回類型 int 
備注 當輸入表達式的計算結果為有效的 numeric 數據類型時,ISNUMERIC 返回 1;否則返回 0。有效的 numeric 數據類型包括以下類型:int,numeric,bigint,money,smallint,smallmoney,

tinyint,float,decimal,real 

 

注意:  對於不是數字的字符(如加號 (+)、減號 (-))和有效貨幣符號(如美元符號 ($))字符,ISNUMERIC 將返回 1。返回值為 1 確保可以將 expression 轉換為上述數字類型中的一種。但是此函數存在Bug,當判斷的表達式是字符類型的表達式時,就亂了!'001,800,900'同樣會認為是數字類型

可以替代的寫法是

PATINDEX('%[^0-9]%', 列名)

如果返回值等於0,則是純數字型(沒有0~9之外的字符)。

case when PATINDEX('%[^0-9]%', 列名)=0 then cast (列名 as decimal(18,0))+cast(1 as decimal(18,0)) else ~~~ end as 起號


免責聲明!

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



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