2017-02-06 140 views
0

我有這個查詢是基於@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和是數字查詢完美的工作,但如果@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。我建議閱讀Erland Sommarskog撰寫的這篇文章,瞭解詳細的解釋以及爲什麼OPTION (RECOMPILE)對於這類查詢很重要。

+0

感謝您的回答,但需要將'@ Amount'參數設置爲'varchar'。 – user3378165