そのままでは、あなたの例は、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()
が、式ではなく数値が必要です
- ステートメントの 2 つのパスが
CASE
異なる型を返しています
あなたのクエリは次のようになると思います:
CASE WHEN IsNumeric([fld2]) = 1 THEN
CONVERT(nvarchar, ROUND(CONVERT(float, [fld2]) / [fld1],
(LEN([theData]) - CHARINDEX([fld2], '.'))))
ELSE
[fld2]
END
上記は、文字列の代わりに数値結果の計算と丸めを行い、不要な変換を行わず、どちらの場合も同じ型を返します。