尝试按用户ID(int)将某些记录与用户匹配。但它将动态完成,我需要能够同时匹配所有记录(我为LIKE通配符传递'%'字符)。我以前做过这件事并且意外地遇到了这个问题。
Declare
@uid varchar = 300
SELECT * FROM items WHERE user_id LIKE @uid
不起作用,但确实如此
Declare
@uid varchar(10) = 300
SELECT * FROM items WHERE user_id LIKE @uid
很好, 为什么第一个版本在未声明varchar的大小时不起作用?为什么不抛出错误?
环境是MSSQL SERVER 2008 R2
答案 0 :(得分:1)
代表以后必须维护代码的所有人,请不要。
varchar不起作用的原因是因为这对于varchar(1)
来说是相同的 - 一个字符宽。话虽如此,如果您想允许检索所有内容或一个用户,请尝试以下操作:
DECLARE @Uid int
-- Get user id 300
SET @Uid = 300
-- Will match on 'User_ID = @Uid'
SELECT * FROM Items WHERE (User_ID = @Uid or @Uid is null) OPTION (RECOMPILE)
-- Get all users
SET @Uid = null
-- Will match on '@Uid is null'
SELECT * FROM Items WHERE (User_ID = @Uid or @Uid is null) OPTION (RECOMPILE)
使用LIKE
要求服务器将您要过滤的每一行转换为字符串,然后进行字符串比较,除了强制进行表扫描外。将=
与is null
一起使用会导致处理器(希望)注意@Uid is null
评估为true
而不考虑行。
根据马丁史密斯的建议,我最后再研究一下,发现更完整discussion of the subject by MVP Erland Sommarskog。无论长短,请务必加入OPTION (RECOMPILE)
以避免次优计划选择。这个建议有一些警告,我建议你阅读这篇文章,以免被他们抓住 - 我要解决一些表现不佳的搜索SP ...