2017-02-06 10 views
0

@AmountパラメータがNULLではなく、クエリの数値であれば、私は@Amountパラメータ、変換に失敗しました

Amount varchar(20)= NULL 

SELECT ..... 
    Format(T1.Amount, 'c', 'en-us') as Amount1, 
    Format(T2.Amount, 'c', 'en-us') as Amount2 
FROM Table1 
WHERE ..... 
    AND (T1.Amount>= CAST(@Amount AS INT) OR T2.Amount >= CAST(@Amount AS INT)) 
    AND @Amount IS NOT NULL 

に基づいており、このクエリを持っています@Amountパラメータが'%'またはNULLの場合は、上記の変換エラーが発生します。

これを解決する方法はありますか?

+0

使用しているSQL Serverのバージョンはどれですか? SQL Server 2012では、[TRY_PARSE](https://msdn.microsoft.com/en-us/library/hh213126.aspx)機能がサポートされています。 –

+5

なぜ '%'の値をintに変換できると思いますか? – Tanner

+0

IsNumeric関数を使用し、IsNumeric関数で適用ケース別に値を設定することもできます。 –

答えて

2

値が数値であるかどうかを確認するための簡単なアプローチ:

DECLARE @Amount VARCHAR(20)= '23'; 

IF ISNUMERIC(@Amount) = 0 
    BEGIN 
     PRINT 'Amount is null or is not a number'; 
    END; 
ELSE 
    BEGIN 
     PRINT 'Amount: ' + @Amount; 
    END; 

WHERE句でそれを行うには:

あなたが @Amountパラメータに適切な intタイプを使用していないのはなぜ
DECLARE @Amount VARCHAR(20)= '23'; 

SELECT 'Some Data' AS Result 
WHERE ISNUMERIC(@Amount) = 1 AND @Amount > 0 
+0

ありがとうございますが、私は 'WHERE'節でそれをチェックする必要がありますか? – user3378165

+0

若干の変更を加えて、私はそれを動作させました。「IF ELSE」は素晴らしいアイデアでした。ありがとうございました! – user3378165

0

varcharをなぜ使用しますか?

@Amountパラメータのタイプをintとし、実際の値またはNULLを渡します。 NULLを渡すと、このパラメータを無視する必要があります。

@Amount int = NULL 

SELECT ..... 
    Format(T1.Amount, 'c', 'en-us') as Amount1, 
    Format(T2.Amount, 'c', 'en-us') as Amount2 
FROM 
    T1 ... JOIN T2 ... 
WHERE 
    ..... 
    AND (@Amount IS NULL OR T1.Amount >= @Amount OR T2.Amount >= @Amount) 
OPTION (RECOMPILE) 

このタイプのクエリは、Dynamic Search Conditionと呼ばれています。私はErland Sommarskogの詳細な説明と、OPTION (RECOMPILE)がこのタイプのクエリーにとって重要な理由を読むために、この記事を読むことをお勧めします。

+0

答えてくれてありがとうございますが、 '@ Amount'パラメータを' varchar'にする必要があります。 – user3378165

関連する問題