2016-02-12 120 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 –