【问题标题】:SQL - conversion issue between nvarchar and moneySQL - nvarchar 和 money 之间的转换问题
【发布时间】:2017-05-09 14:46:14
【问题描述】:

我正在尝试将 nvarchar(255) 数据类型转换为货币,我收到以下错误消息:“无法将 char 值转换为货币。char 值的语法不正确。”

我在 Stockoverflow 上发现了一些建议我以下面的格式添加 isNull 的东西,但我仍然遇到同样的错误。

SUM(isnull(cast(tbl_ALL_DATA_REPORT.[30_days_ago_sales] as money),0)) AS SumOf30_Days_Ago, 

知道我在这里做错了什么吗?

【问题讨论】:

  • 我会远离实际的货币类型。这是有效数据转换类型的图表。 docs.microsoft.com/en-us/sql/t-sql/data-types/…
  • 您能否提供一些您尝试转换的数据示例?
  • @Jacob H - 我拍了几行的快照。我希望你能看到它。所以我有 NULL 值,我有 10535.950000001 或 520.190000000005 等。

标签: sql sql-server tsql


【解决方案1】:

某些值包含无效字符。您可以尝试使用 try_cast

declare @n nvarchar(50) = '50n.25'
select isnull(try_cast(@n as money), 0)

在你的场景中

SUM(isnull(try_cast(tbl_ALL_DATA_REPORT.[30_days_ago_sales] as money),0)) AS SumOf30_Days_Ago, 

【讨论】:

    【解决方案2】:

    试试这个,在 CAST 中使用你的 ISNULL:

    SUM(cast(ISNULL(tbl_ALL_DATA_REPORT.[30_days_ago_sales],0) as DECIMAL(19,12))) AS SumOf30_Days_Ago,
    

    另外,我将您的 MONEY 更改为 DECIMAL,因为 MONEY 最多有 5 个小数位。

    【讨论】:

    • @Jackob H - 我试过了,我得到:“将数据类型 nvarchar 转换为数字时出错。”
    • 我会说尝试使用单个值进行测试。可能与数据有关。
    【解决方案3】:

    您很可能在无法转换的数据集中包含无效字符或非数字的内容。在做出这样的假设之前检查数据是否实际上是“数字”:

    DECLARE @X TABLE (val VARCHAR(8));
    
    INSERT INTO @X (val) VALUES (NULL), ('abc'),('4'),('%&Crazy')
    
    Select 
      val AS ASIS
    , ISNULL(val, 0) AS firstCastWillWorkForNullsNotMuchElse
    , CASE WHEN ISNUMERIC(ISNULL(val, 0)) <> 0 THEN ISNULL(val, 0) ELSE 0 END AS secondCastToCheckNumeric
    , CAST(CASE WHEN ISNUMERIC(ISNULL(val, 0)) <> 0 THEN ISNULL(val, 0) ELSE 0 END AS MONEY) AS thirdCastDoesItAll
    From @X
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 2023-03-24
      • 2013-03-25
      • 1970-01-01
      • 2022-01-11
      • 2016-03-18
      • 2023-04-05
      相关资源
      最近更新 更多