在SQL更新期间跳过过去的错误并继续的最佳方法是什么?

时间:2011-06-08 00:35:14

标签: sql sql-server tsql

我在表中有一个varchar列,我希望将其数据插入同一个表中数据类型为money的另一列中。源列中的某些值是我想忽略的大数字,只是想将这些值设置为NULL。

我试过了:

UPDATE MyTable SET destCol = CASE WHEN IsNumeric(sourceCol) = 1 THEN sourceCol END

但是当它试图测试大数字时会抛出“算术溢出错误......”。

我想我可能需要某种功能或在存储过程中使用try / catch块来获得我想要的功能。

更新

我忘了提到源列中的某些值具有根本无法转换为金钱的文本值,这些值也需要设置为NULL。

2 个答案:

答案 0 :(得分:2)

如果问题是由大量数字引起的,您可以限制为可转换为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

答案 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'?)