当变量是varchar(4)但不是varchar时,SQL LIKE匹配int

时间:2013-02-22 20:03:48

标签: sql-server-2008

尝试按用户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

1 个答案:

答案 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 ...