【问题标题】:SQL Server: Error converting data type nvarchar to numericSQL Server:将数据类型 nvarchar 转换为数字时出错
【发布时间】:2016-01-20 03:42:08
【问题描述】:

如果我运行下面的 SQL 查询;我收到以下错误:

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

COLUMNA 仅包含数字(负数和正数),包括在小数点后最多两位数的字段,并存储为点十进制数。

IF OBJECT_ID('st00_TABLEA','U') IS NOT NULL DROP TABLE [st00_TABLEA]
SELECT 
    COLUMNA AS COLUMNA_s
    ,CASE WHEN [COLUMNA] = '' THEN 0 ELSE CONVERT(NUMERIC(18,2),REPLACE([COLUMNA],',','.')) END AS COLUMNA
INTO st00_TABLEA
FROM dbosu.TABLEA;

我也尝试了以下,但仍然是同样的问题:

IF OBJECT_ID('st00_TABLEA','U') IS NOT NULL DROP TABLE [st00_TABLEA]
SELECT 
    COLUMNA AS COLUMNA_s
    ,CONVERT(DECIMAL(18,2),COLUMNA) AS COLUMNA
INTO st00_TABLEA
FROM dbosu.TABLEA;

【问题讨论】:

    标签: sql-server type-conversion


    【解决方案1】:

    您可能需要修改列中的数据,但无论如何您可以执行以下操作之一:-

    1- 检查它是否是数字,然后将其转换为其他值,例如 0

    Select COLUMNA AS COLUMNA_s, CASE WHEN Isnumeric(COLUMNA) = 1
    THEN CONVERT(DECIMAL(18,2),COLUMNA) 
    ELSE 0 END AS COLUMNA
    

    2- 仅从列中选择数值

    SELECT COLUMNA AS COLUMNA_s ,CONVERT(DECIMAL(18,2),COLUMNA) AS COLUMNA
    where Isnumeric(COLUMNA) = 1
    

    【讨论】:

    • 感谢您的意见;但是它现在给了我另一个错误:在“REGEXP”附近的预期条件的上下文中指定的非布尔类型的表达式。
    • 谢谢!现在它起作用了。因此,在您的查询中,您检查单元格是否为数字;如是;然后转换它们。虽然我不明白; COLUMNA 实际上只有表中的数值(负数和正数,以及零)。你知道为什么仍然需要检查 isumeric 吗?
    • 不客气.. 需要以某种方式调查数据.. 您可以使用此查询的输出并将其与表中的原始数据进行比较,如果您发现某个值存在差异,则该值可能是问题
    【解决方案2】:

    如果浮点值带有字符 'e' '+',如果我们尝试转换为十进制,则会出错。 ('2.81104e+006')。它仍然通过 ISNUMERIC 测试。

    SELECT ISNUMERIC('2.81104e+006') 
    

    返回1

    SELECT convert(decimal(15,2), '2.81104e+006') 
    

    返回

    错误:将数据类型 varchar 转换为数字时出错。

    SELECT try_convert(decimal(15,2), '2.81104e+006') 
    

    返回NULL

    SELECT convert(float, '2.81104e+006') 
    

    返回正确的值2811040

    【讨论】:

    • 这让我免于遇到科学记数法偶尔出现的 XML 解析情况 - 非常感谢。 SELECT ISNULL(DataRows.ID.value(N'(@SomeValThatFails)[1]','DECIMAL(6,5)'), -1), ISNULL(DataRows.ID.value(N'(@SomeOtherValThatWorks)[1 ]','FLOAT'), -1) FROM @XML.nodes('./XMLNodes') AS DataRows(ID)
    【解决方案3】:

    我在从 nvarchar 转换为 float 时遇到了这个错误。
    我必须做的是在 nvarchar 字段上使用LEFT 函数。

    示例:Left(Field,4)

    基本上,查询将如下所示:

    Select convert(float,left(Field,4)) from TABLE
    

    SQL 将它复杂到这种程度真是荒谬,而使用 C# 则轻而易举!
    希望它可以帮助那里的人。

    【讨论】:

    • 谢谢,我尝试了我能想到的所有方法,但没有任何效果,我想该领域还有其他东西。但是我建议高于左(字段,4),我使用左(字段,48),因为我已将列定义为 nvarchar(50)
    猜你喜欢
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 2017-03-23
    • 2017-03-15
    • 2015-02-13
    • 1970-01-01
    • 2012-02-26
    • 2017-06-11
    相关资源
    最近更新 更多