“使用CASE WHEN语句将数据类型nvarchar转换为float时出错”

时间:2013-08-13 20:52:25

标签: sql sql-server-2008 tsql

我正在尝试使用以下内容作为select语句之一运行查询,并且我不断收到错误“将数据类型nvarchar转换为float时出错”。我一直在将VBA IIf语句转换为CASES,我似乎无法正确转换。 fld2是nvarchar(15),fld1是float数据类型。我需要帮助查明为什么会抛出这个错误。

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

1 个答案:

答案 0 :(得分:2)

按原样,您的示例将为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语句的两个路径返回不同的类型
  3. 我认为您的查询应该是:

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

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

相关问题