【问题标题】:"Error converting data type nvarchar to float" with CASE WHEN Statement使用 CASE WHEN 语句“将数据类型 nvarchar 转换为浮点数时出错”
【发布时间】:2013-08-14 05:19:01
【问题描述】:

我正在尝试使用以下作为选择语句之一运行查询,但我不断收到错误“将数据类型 nvarchar 转换为浮点数时出错”。我一直在将 VBA IIf 语句转换为 CASES,但似乎无法正确转换。 fld2 是 nvarchar(15) 而 fld1 是浮点数据类型。我需要帮助查明引发此错误的原因。

 CASE WHEN (IsNumeric([fld2]) = 1) THEN Round(Convert(nvarchar,[fld2]) + 
   ' / ' + Convert(nvarchar,[fld1]),(Len(Convert(nvarchar,[theData])) -
  Charindex(Convert(nvarchar, [fld2]),'.'))) ELSE [fld2] END,

【问题讨论】:

  • 我相信 CASE 会评估它的所有部分,所以即使 IsNumeric 为假并且 ELSE 部分已执行 - 第一部分仍会尝试计算
  • 为什么要将字符串传递给ROUND() 函数?
  • 使用舍入给出将国际测量值转换为美国测量值的结果
  • ROUND() 需要数字类型,但不是字符串;你的除法操作数也是如此。
  • @Cory,所以基本上我可以写'Round([fld1]/[fld2])',因为字段是数字。

标签: sql sql-server-2008 tsql


【解决方案1】:

照原样,您的示例将生成一个非常有趣的表达式供 SQL 服务器评估。让我们将值替换为 fld1fld2theData 作为示例,看看您要做什么:

[fld1]    = 42.0
[fld2]    = N'69.56'
[theData] = N'something'

(字符串前的N 使其成为nvarchar 而不是varchar

使用替换,生成的查询将如下所示:

CASE WHEN (IsNumeric(N'69.56') = 1) THEN 
    Round(Convert(nvarchar,'69.56') + ' / ' + Convert(nvarchar, 42.0),
        (Len(Convert(nvarchar,'something')) - Charindex(Convert(nvarchar, N'69.56'),'.')))  
ELSE 
    N'69.56' 
END

由于您不需要将nvarchar 显式转换为nvarchar,因此您的查询实际上看起来更像:

CASE WHEN (IsNumeric(N'69.56') = 1) THEN 
    Round(N'69.56 / ' + Convert(nvarchar, 42.0),
        (Len(N'something') - Charindex(N'69.56','.')))  
ELSE 
    N'69.56'
END

所以有几个问题:

  1. 您将 varchar 值传递给 ROUND() 函数,该函数需要一个数值,而不是表达式
  2. CASE 语句的两条路径返回不同的类型

我认为您的查询应该是这样的:

CASE WHEN IsNumeric([fld2]) = 1 THEN 
    CONVERT(nvarchar, ROUND(CONVERT(float, [fld2]) / [fld1],
        (LEN([theData]) - CHARINDEX([fld2], '.'))))
ELSE 
    [fld2]
END

上面对数字结果而不是字符串进行数学运算和舍入,不进行任何不必要的转换,并且在两种情况下都返回相同的类型。

【讨论】:

  • 我非常感谢您的回复。我目前是一名实习生,正在研究一些复杂的系统,但我并不总是得到我需要的指导,所以我可能不明白系统实际上在做什么。最重要的是,到目前为止,我只有基本的 VB 编程。
  • 当然,这段代码假定 FLD1 永远不会为 0。我也尝试解决除以零的问题。
猜你喜欢
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 2021-08-08
  • 1970-01-01
  • 2017-03-23
  • 2017-03-15
相关资源
最近更新 更多