在MS SQL中使用变量拼接LIKE模糊查询返回错误结果
解决MS SQL变量LIKE查询结果异常的问题
这种情况我之前也碰到过,大概率是数据类型不匹配引发的隐式转换搞的鬼!让我给你拆解一下问题原因和解决方案:
问题根源
你定义的变量@Search是nvarchar(4)类型,但如果你的表中column1/column2/column3是varchar类型的话,执行LIKE '%' + @Search时会发生隐式类型转换:SQL Server会把varchar类型的列值自动转为nvarchar类型来匹配变量的类型。这种转换不仅可能影响查询性能,更关键的是会改变LIKE的匹配逻辑,导致本该匹配的行没有被统计到,所以你得到了错误的计数1。
而当你直接用字符串'883C'时,这个字符串默认是varchar类型(除非你加了N前缀),和列的类型一致,所以匹配正常,能得到正确结果。
解决方案
方案1:让变量类型和列类型保持一致
先检查你的列数据类型(可以用sp_help 'dbo.Table'查看),如果列是varchar,就把变量改为varchar类型:
DECLARE @Search varchar(4) = '883C' SELECT DISTINCT COUNT(DISTINCT [t].[column1]) FROM [dbo].[Table] [t] WHERE ([t].[column1] LIKE '%' + @Search OR [t].[column2] LIKE '%' + @Search OR [t].[column3] LIKE '%' + @Search )
这是最优方案,既能避免隐式转换,又能保证查询的性能和准确性。
方案2:显式转换列的类型(不推荐,影响索引)
如果因为某些原因必须使用nvarchar变量,可以把列显式转为nvarchar类型来匹配:
DECLARE @Search nvarchar(4) = '883C' SELECT DISTINCT COUNT(DISTINCT [t].[column1]) FROM [dbo].[Table] [t] WHERE (CAST([t].[column1] AS nvarchar(MAX)) LIKE '%' + @Search OR CAST([t].[column2] AS nvarchar(MAX)) LIKE '%' + @Search OR CAST([t].[column3] AS nvarchar(MAX)) LIKE '%' + @Search )
注意:这种方式会让列上的索引失效,查询性能会下降,所以优先选方案1。
验证建议
你可以先执行SELECT SQL_VARIANT_PROPERTY('883C', 'BaseType')和SELECT SQL_VARIANT_PROPERTY(@Search, 'BaseType'),对比两者的类型差异,就能直观看到问题所在了。
内容的提问来源于stack exchange,提问作者Joanne Mullally-Watts
相关产品推荐
相关产品推荐

