2016-02-12 122 views
2

我想在SQL中編寫where子句,其中有日期範圍搜索,但如果用戶輸入票號,它將完全忽略日期範圍。SQL條件where子句不起作用

我遇到的問題是日期範圍不起作用,無論您輸入哪個日期(無票號),它都會返回所有結果。

(weighing.TicketNo LIKE '%'+ @TicketNo + '%' OR 
(@TicketNo = '' AND [Weighing].[WeighingDate] BETWEEN @startDate AND @endDate)) 
+0

是否有可能在@TicketNo變量包含NULL而不是一個空字符串? –

+4

SQL串聯是所有SQL注入邪惡的根源。考慮如果你傳遞一個空的TicketNo會發生什麼:'(weigh.TicketNo LIKE'%%'OR(@TicketNo =''AND [Weighing]。[WeighingDate] BETWEEN @startDate AND @endDate))''。該*是*所有記錄 –

+0

如果您要使用TicketNo作爲模式,請將通配符作爲參數@TicketNo的一部分傳遞,因此您不必連接字符串。 –

回答

4

如果你進入一個空白的票號,然後第一部分計算爲這樣:

weighing.TicketNo LIKE '%%' 

多少記錄滿足了嗎?他們全部。

我建議你試試這個:

(ISNULL(@TicketNo,'') <> '' AND weighing.TicketNo LIKE '%'+ @TicketNo + '%') 
OR 
(ISNULL(@TicketNo,'') = '' AND [Weighing].[WeighingDate] 
BETWEEN @startDate AND @endDate) 
+0

這似乎工作。我明白你對'%%'的含義,我沒有真正考慮過這一點。 – connersz

+0

這是有史以來最深入的可選參數研究。當心,因爲他們可能有意想不到的性能問題。 http://www.sommarskog.se/dyn-search.html –