簡體   English   中英

在 SQL 更新期間跳過過去的鑄造錯誤並繼續的最佳方法是什么?

[英]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.5808922,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM