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

Posted

技术标签:

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

【问题讨论】:

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

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

将现有 SQL Server 2005 数据库中的数据类型 varchar 更改为 nvarchar。有啥问题吗?

在 SQL Server 2008 中将 NVARCHAR 转换为 INT 数据类型

在sql server数据库中将一个nvarchar类型的空值转换成decimal(18,3)类型

无法在 SQL Server 2008 中使用 where 子句获取 nvarchar 类型数据

SQL Server Nvarchar(最大值)

Spring JDBC for SQL Server - 使用 SQLXML 数据类型产生 SQLServerException:不允许从数据类型 xml 到 nvarchar(max) 的隐式转换