1

Select ステートメントの 1 つとして次のクエリを実行しようとしていますが、「データ型 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,
4

1 に答える 1

2

そのままでは、あなたの例は、SQL サーバーが評価する非常に面白い式を生成します。fld1fld2、およびの値を置き換えて、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

したがって、いくつかの問題があります。

  1. varchar関数に値を渡していますROUND()が、式ではなく数値が必要です
  2. ステートメントの 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 に答える