我在表中有一个varchar列,我希望将其数据插入同一个表中数据类型为money的另一列中。源列中的某些值是我想忽略的大数字,只是想将这些值设置为NULL。
我试过了:
UPDATE MyTable SET destCol = CASE WHEN IsNumeric(sourceCol) = 1 THEN sourceCol END
但是当它试图测试大数字时会抛出“算术溢出错误......”。
我想我可能需要某种功能或在存储过程中使用try / catch块来获得我想要的功能。
更新
我忘了提到源列中的某些值具有根本无法转换为金钱的文本值,这些值也需要设置为NULL。
答案 0 :(得分:2)
如果问题是由大量数字引起的,您可以限制为可转换为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
答案 1 :(得分:1)
假设您只想转换简单数字,那么就像:
UPDATE MyTable SET destCol = CASE WHEN not sourceCol like '%[^0-9]%' and LEN(sourceCol) <= 8 THEN sourceCol END
这将尝试使用最多8位数的字符串更新destCol。如果您需要允许使用货币符号或千位或小数分隔符,则还需要在LIKE
表达式中包含这些符号。
与ISNUMERIC
一样,这个问题是它回答了一个没有人有用的问题(这个字符串可以转换成任何数字类型吗?),而不是有用的东西(可以吗?)字符串转换为数字类型'X'?)