1

我正在尝试使用以下作为选择语句之一运行查询,并且我不断收到错误“将数据类型 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,
4

1 回答 1

2

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

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

N字符串之前的 an 使其成为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

由于您不需要显式转换nvarcharnvarchar,您的查询实际上看起来更像:

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

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

于 2013-08-13T21:11:09.213 回答