【问题标题】:How to safely convert NVARCHAR to MONEY如何安全地将 NVARCHAR 转换为 MONEY
【发布时间】:2012-08-12 23:54:48
【问题描述】:

我有一个现有的表,其中包含NVARCHAR 类型的“price_info”列。我想添加一个MONEY 类型的新列“价格”,并(在可能的情况下)将“价格信息”列的内容转换/复制到其中。

如果 'price_info' 仅包含数字数据,则可以轻松转换该值。但当然 'price_info' 也可以包含无法转换为 MONEY 类型的数据,在这种情况下会发生错误。

有没有办法只复制成功转换为MONEY 的值,而忽略所有其他行(或在这些情况下将“价格”列设置为 0)?

例如我想要的是这样的(伪代码):

update products set price = some_conversion_function(money, price_info, 0)

(其中 0 是转换失败时使用的默认值)。

【问题讨论】:

    标签: sql-server sql-server-2008 tsql type-conversion


    【解决方案1】:

    如果您只需要通过脚本执行此操作,则可以运行 2 次更新。

    更新 1:运行更新并设置 ISNUMERIC 为 true 的价格

    update products 
    set price = convert(money, price_info)
    where ISNUMERIC(price_info) = 1
    

    更新 2:运行更新以将价格设置为 0,其中 ISNUMERIC 为假。

    update products 
    set price = 0
    where ISNUMERIC(price_info) = 0
    

    您可以在此处http://msdn.microsoft.com/en-us/library/ms186272.aspx获取有关 ISNUMERIC 的文档

    【讨论】:

    • try_convert 仅适用于 2012 年。问题标记为 2008
    • 我直接从他的问题中复制了代码,我添加的只是 WHERE 子句,实际上我什至不知道 try_convert,我以为这是他们编写的自定义函数。是时候阅读了:)
    • 谢谢,这行得通。我不知道有 try_convert 函数(因为我使用的是 SQL 2008),但它仍然适用于普通的 convert 函数。
    • 我使用try_convert 来作为我想要的示例(某种伪代码)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多