照原样,您的示例将产生一个非常有趣的表达式供 SQL 服务器评估。让我们将值替换为fld1
,fld2
和theData
作为示例,看看您要做什么:
[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
由于您不需要显式转换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
上面对数字结果而不是字符串进行数学运算和舍入,不进行任何不必要的转换,并且在两种情况下都返回相同的类型。