![](/img/trans.png)
[英]What's the best way to handle database errors in Go without getting coupled to the SQL driver?
[英]What's the best way to skip past casting errors during SQL update and continue?
我在一個表中有一個 varchar 列,我想將它的數據插入到同一個表中的另一個列中,其中它的數據類型是錢。 源列中的一些值是我想忽略的大數字,只想將這些值設置為 NULL。
我試過這個:
UPDATE MyTable SET destCol = CASE WHEN IsNumeric(sourceCol) = 1 THEN sourceCol END
但是,當它嘗試測試大數時,這會引發“算術溢出錯誤......”。
我想我可能需要某種 function 或在存儲過程中使用 try/catch 塊來獲得我想要的功能。
更新
我忘了提到源列中的某些值具有根本無法轉換為貨幣的文本值,這些值也需要設置為 NULL。
如果問題是由巨大的數字引起的,您可以限制那些可以轉換為money
的數字
UPDATE MyTable
SET destCol = CAST(sourceCol AS money)
WHERE sourceCol < 922337203685477.5807
money
范圍是從-922,337,203,685,477.5808
到922,337,203,685,477.5807
的貨幣
[編輯]
所以你有 varchar 列。 你可以這樣做:
UPDATE MyTable
SET destCol =
CASE WHEN Len(sourceCol) < 15 AND ISNUMERIC(sourceCol) = 1 THEN CAST(sourceCol AS MONEY) ELSE 0 END
假設您只想轉換簡單的數字,則類似於:
UPDATE MyTable SET destCol = CASE WHEN not sourceCol like '%[^0-9]%' and LEN(sourceCol) <= 8 THEN sourceCol END
這將嘗試使用最多 8 位數字的任何字符串更新 destCol。 如果您需要允許貨幣符號或千位或小數分隔符,您還需要在LIKE
表達式中包含這些符號。
與往常一樣, ISNUMERIC
的問題是它回答了一個沒人用的問題(這個字符串可以轉換為任何數字類型嗎?),而不是有用的東西(這個字符串可以通過轉換為數字類型嗎? X'?)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.