2012-08-10 17 views
5

は、私は、このような何かを適切な型にnvarchar型の値を変換するCASEを使用していますSELECTをやって評価しましたではなく、と同等です。実行可能な例:CASEはTHEN句は常に

declare @proptype nvarchar(50)= 'nvarchar' 
declare @val nvarchar(10) = 'test' 
select 
    case @proptype 
     when 'money' then convert(money, @val) 
     else @val 
    end 

どうしてこれを回避できますか?

CASE文は条件を順に評価し、条件が満たされる最初の条件で を停止します。一部の 状況では、CASEステートメント がその入力として式の結果を受け取る前に式が評価されます。これらの式を評価するエラーは である可能性があります。 がWHENのCASE文の引数に最初に評価され、次に がCASE文に提供されるという集計式が評価されます。たとえば、次のクエリ は、MAX アグリゲートの値を生成するときにゼロ除算エラーを生成します。これは、CASE式を評価する前に発生します。

これは関連性はありませんが、言語は非ネイティブのため多少重いので多分そうですか?

+0

唯一の目的は、そう私の知る限り、フォーマットの目的のために、ありますクライアントがフォーマットを処理するかどうか? –

+1

ソースデータは私のコントロール下にありません。実際のケースでは、データをそのような形式にするためにかなりのフープを飛ばしなければなりません。適切な型付けされたレポートテーブルに挿入することができます – carlpett

答えて

3

は、最初の考えは最初に評価 値が数値であるので、10進数に変換され、他のすべての のデータが期待されている」一般的に以下のいずれか、次のUse caution when Using CONVERT() with CASE or IF functions in Transact SQL (T-SQL)

を見てくださいSQL Serverが のいずれかの値を指定された型に変換できる場合は、すべての値は に変換された型であると予測されます。しかし、それは正しくありません (ただし、2番目は近いです)!

本当の問題は、Caseステートメント内のどこにでも を値に変換することを選択した場合、データ型は、あなたが値 を変換することであると、すべての値の予想タイプにかかわらず、彼らは そのタイプかである場合のありますない。さらに、たとえ値のNONEが実際に に変換されても(Convertのコード行が実行されない場合でも)、 のALLは、 Convert関数によって指定された型のままであると予想されます。

+0

ありがとう、これは理由を明らかにしますが、それから実際に進む方法はありませんか? – carlpett

1

then句はないが評価されている何が起こっているかを明確にすることが。

あなたはあなたが行う場合は、同じエラーが表示さ

SELECT CASE @proptype 
     WHEN 'money' THEN $1.0 /*<-- Literal of datatype money*/ 
     ELSE @val 
     END 

CASEのドキュメントは、戻り値の型

result_expressionsとオプションでタイプのセットから最も優先順位の高いタイプを返しますと説明else_result_expression。 の詳細については、Data Type Precedence (Transact-SQL)を参照してください。

moneyのでelse @valmoneyにキャストし、失敗しますことを評価されnvarcharより高いデータ型の優先順位を持っています。

考えられる回避策の1つは、sql_variantにキャストすることです。これは両方よりもデータ優先度が高いためです。あなたが開始するために必要なフォーマットに保存していないのいずれか、なぜそれが暗黙裏varchar` `に変換されますときに明示的money``に `varchar`を変換する

declare @proptype nvarchar(50)= 'nvarchar' 
declare @val nvarchar(10) = 'test' 
select 
    case @proptype 
     when 'money' then convert(money, @val) 
     else cast(@val as SQL_VARIANT) 
    end 
関連する問題