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

Posted

技术标签:

【中文标题】将数据类型 nvarchar 转换为数值异常时出错【英文标题】:Error converting data type nvarchar to numeric exception 【发布时间】: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]

谁能帮我清除这个错误?

【问题讨论】:

【参考方案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]

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

【讨论】:

以上是关于将数据类型 nvarchar 转换为数值异常时出错的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:将数据类型 nvarchar 转换为数字时出错

将数据类型 int 转换为 nvarchar 时出错

将数据类型 NVarchar 转换为 int 时出错

特定列 -- 将数据类型 nvarchar 转换为 bigint 时出错

将 nvarchar 转换为数据类型 int 时出错

SQL 异常:将 nvarchar 值“[anyvalue]”转换为数据类型 int 时转换失败