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