我正在尝试使用以下内容作为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,
答案 0 :(得分:2)
按原样,您的示例将为SQL服务器生成一个非常有趣的表达式来进行评估。我们将fld1
,fld2
和theData
的值替换为例子来查看您要执行的操作:
[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
因此存在一些问题:
varchar
值传递给ROUND()
函数,该函数需要数值,而不是表达式CASE
语句的两个路径返回不同的类型我认为您的查询应该是:
CASE WHEN IsNumeric([fld2]) = 1 THEN
CONVERT(nvarchar, ROUND(CONVERT(float, [fld2]) / [fld1],
(LEN([theData]) - CHARINDEX([fld2], '.'))))
ELSE
[fld2]
END
上面对数字结果进行数学和舍入而不是字符串,不进行任何不必要的转换,并且在两种情况下都返回相同的类型。