我想在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的一部分传递,因此您不必连接字符串。 –