错误:无法将数据类型nvarchar转换为float

7

我在这个论坛和谷歌上搜索了很久,但仍无法解决问题。

我们有两个表(相信我,我与这些表没有任何关系)。两个表都有一个名为eventId的列。

然而,在一个表中,eventId的数据类型是float,而在另一个表中,它是nvarchar

我们从定义为floattable1中选择,并将该ID保存到定义为nvarchar(50)table2中。

由于数据类型不匹配,我们得到了“将数据类型nvarchar转换为float时出错”的错误。

在不操作数据库的情况下,我想将eventId强制转换以消除此错误。

你们有什么好的想法来修复下面代码的问题吗?

SELECT 
    CAST(CAST(a.event_id AS NVARCHAR(50)) AS FLOAT) event_id_vre,

你读过这个吗:http://msdn.microsoft.com/zh-cn/library/ms191530(v=sql.105).aspx? - Sybren
只要event_id可以这样转换,你的代码就没问题。也许try_cast会有帮助:找出哪一行出了问题。很可能是因为你搞混了与语言相关的分隔符(逗号和句点)。或许你最好使用nvarchar而不是float类型进行连接。 - Christian4145
4个回答

8
问题很可能是因为一些行的event_id为空。有两种解决方法:
  • 将您的float转换为nvarchar,而不是反过来 - 这种转换总是会成功的。唯一的问题在于,如果文本表示不同 - 比如,使用float作为nvarchar的表使用更少的小数位数,或者
  • 在转换之前添加一个检查空ID的条件 - 如果某些事件ID是非空字符串,但它们也无法转换为浮点数(例如字段中有一个单词而不是数字),则此方法可能无效。

第二个解决方案如下:

SELECT 
     case when a.eventid <> '' 
            then cast(cast(a.event_id as nvarchar(50)) as float) 
          ELSE 0.0 
     END AS event_id_vre,

0
我还收到了消息“将nvarchar数据类型转换为float时出错”。这是来自SQL Server 2019的SQL Server Management Studio(SSMS)中的查询。
在我的情况下,源数据中有些不可辨认的字符,这些数据是从Excel导出到CSV中的。某些列的格式是“会计”格式,其中包含空格、货币符号、逗号和括号,如下所示:
 - positive values: $ 123,456.78
 - negative values: $(123,456.78)

为了解决这个问题,我简单地插入了一个嵌套的REPLACE()函数来删除一些字符并替换其他字符,并用IsNull()包装它以在必要时返回零。
首先,我将描述:
  • 用空字符串或空引号''替换任何$,)
  • 用连字符或负号-替换任何(
以下是SQL代码:
Original:
CONVERT(float, exp_TotalAmount)

Replacement:
CONVERT(float, IsNull(REPLACE(REPLACE(REPLACE(REPLACE(exp_TotalAmount,'(','-'),')',''),',',''),'$',''),0))

Here broken up for easier read, innermost first:
REPLACE(exp_TotalAmount, '(', '-')
REPLACE(X, ')', '')
REPLACE(X, ',', '')
REPLACE(X, '$', '')
IsNull (X, 0)
CONVERT(float, X)

0
我也遇到了这个问题,当我尝试插入到一个已存在的SQL表中时。我的问题不是针对某一列的。我所做的是指定我要插入的列,并按照它们在目标表中的顺序进行插入。这并不是一个实际可行的解决方案,如果你有太多的列可能无法工作。类似这样的操作:
INSERT INTO [DBName].[dbo].[TableName1] SELECT 在[TableName1]中按照顺序列出你的列名 FROM [DBName].[dbo].[TableName1]

-5

将浮点数转换为nvarchar,而不是将nvarchar转换为浮点数。当然!


8
请添加一些细节说明您为什么认为这是正确的答案,并删除“当然!”因为它没有任何意义。 - David Waterworth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接