我想在SQL中編寫where子句,其中有日期範圍搜索,但如果用戶輸入票號,它將完全忽略日期範圍。SQL條件where子句不起作用
我遇到的問題是日期範圍不起作用,無論您輸入哪個日期(無票號),它都會返回所有結果。
(weighing.TicketNo LIKE '%'+ @TicketNo + '%' OR
(@TicketNo = '' AND [Weighing].[WeighingDate] BETWEEN @startDate AND @endDate))
我想在SQL中編寫where子句,其中有日期範圍搜索,但如果用戶輸入票號,它將完全忽略日期範圍。SQL條件where子句不起作用
我遇到的問題是日期範圍不起作用,無論您輸入哪個日期(無票號),它都會返回所有結果。
(weighing.TicketNo LIKE '%'+ @TicketNo + '%' OR
(@TicketNo = '' AND [Weighing].[WeighingDate] BETWEEN @startDate AND @endDate))
如果你進入一個空白的票號,然後第一部分計算爲這樣:
weighing.TicketNo LIKE '%%'
多少記錄滿足了嗎?他們全部。
我建議你試試這個:
(ISNULL(@TicketNo,'') <> '' AND weighing.TicketNo LIKE '%'+ @TicketNo + '%')
OR
(ISNULL(@TicketNo,'') = '' AND [Weighing].[WeighingDate]
BETWEEN @startDate AND @endDate)
這似乎工作。我明白你對'%%'的含義,我沒有真正考慮過這一點。 – connersz
這是有史以來最深入的可選參數研究。當心,因爲他們可能有意想不到的性能問題。 http://www.sommarskog.se/dyn-search.html –
是否有可能在@TicketNo變量包含NULL而不是一個空字符串? –
SQL串聯是所有SQL注入邪惡的根源。考慮如果你傳遞一個空的TicketNo會發生什麼:'(weigh.TicketNo LIKE'%%'OR(@TicketNo =''AND [Weighing]。[WeighingDate] BETWEEN @startDate AND @endDate))''。該*是*所有記錄 –
如果您要使用TicketNo作爲模式,請將通配符作爲參數@TicketNo的一部分傳遞,因此您不必連接字符串。 –