2017-02-06 4 views
0

У меня есть этот запрос, основанный на @Amount параметраКонверсия удалось при преобразовании значения VARCHAR «%» для INT Ошибка типа данных

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и числовой запрос работает отлично, но если параметр @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 пункте:

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

Почему вы не используете подходящий тип int для параметра @Amount ? Почему вы используете 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. Я рекомендую прочитать эту статью Эрландом Соммарскогом для подробных объяснений и почему OPTION (RECOMPILE) важен для этого типа запросов.

+0

Благодарим вас за ответ, но это требование иметь параметр '@ Amount' как' varchar'. – user3378165