【问题标题】:Error converting data type nvarchar to numeric exception将数据类型 nvarchar 转换为数值异常时出错
【发布时间】:2018-08-11 11:35:15
【问题描述】:

我尝试在 SQL Server Management Studio 中执行如下所示的查询,但出现此错误

将数据类型 nvarchar 转换为数值异常

查询:

SELECT TOP 100 
    CASE WHEN ISNUMERIC(SUM(CAST([dbo].[Orders].[CustomerID] AS DECIMAL (38, 4)))) = 1 
            THEN CAST(SUM(CAST ([dbo].[Orders].[CustomerID] AS DECIMAL (38, 4))) AS INT) 
            ELSE NULL 
    END AS [Column1] 
FROM
    [dbo].[Orders]

谁能帮我清除这个错误?

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    停下来想一想。通常,对 ID 列求和是没有意义的。这样的总和没有任何意义,除非你的模式中隐含着一些东西。您可以有 1000 个客户 1 的订单或 2 个客户 500 的订单。这两种情况的总和值相同 - 这有用吗?

    此外,您的错误意味着您的 ID 列不是数字。在这种情况下,您对 isumeric 的使用应该是 INSIDE 和表达式。总和聚合将始终返回一个数值;没有任何有用的理由将其放置在非数字/合并函数中。

    最后,您的架构是相关的。有人选择将 ID 列定义为 nvarchar - 为什么?也许有一个很好的理由,但在这一点上似乎不太可能。该选择表明表格设计者打算允许 ID 列中的任何字符 - 您现在已经确认。所以我回到第一段 - 充其量只能对列中的值的子集求和。那是有用的信息吗?

    最终,如果您需要这样做,那么您可以在查询中反转 sum/isnumeric 的相对位置。

    select sum(case when isnumeric(CustomerID) = 1 
        then cast(CustomerID as ...) else 0 end) as Column1
    from dbo.Orders;
    

    请记住,数字并不像人们想象的那么有用。您可以在论坛中搜索替代方案。如果您是当前版本的 sql server,则可以使用 try_cast 而没有 case/isnumeric 的复杂性。

    也许您的意思是计算每个客户的订单?

    【讨论】:

      【解决方案2】:

      试试这个:

      SELECT TOP 100 
          CASE WHEN ISNUMERIC( 
              SUM (
                  CAST ([dbo].[Orders].[CustomerID] AS DECIMAL (38,4))) 
              ) = 1 
          THEN CAST( 
              SUM (
                  CAST ([dbo].[Orders].[CustomerID] AS DECIMAL (38,4))) 
              ) AS INT
          ELSE NULL END AS [Column1] 
      FROM [dbo].[Orders]
      

      当您没有正确格式化代码并且没有提供示例数据时,修复错误代码有点困难。

      【讨论】:

        猜你喜欢
        • 2012-10-14
        • 2020-03-14
        • 1970-01-01
        • 1970-01-01
        • 2018-07-01
        • 2015-03-14
        • 2015-12-24
        • 2020-06-02
        • 2012-09-25
        相关资源
        最近更新 更多