使用Like时SQL Server存储过程无法返回正确值的问题
问题分析与修复方案
一、查询无结果的修复
1. 修正存储过程参数类型
存储过程中@LikeTitle使用VARCHAR(100),但表中Title是NVARCHAR(100)(Unicode类型),传递带口音的字符(如é)时会丢失信息,导致匹配失败。将参数改为NVARCHAR(100):
CREATE PROCEDURE [dbo].[spGame_GetSimilarTitles] @LikeTitle NVARCHAR(100) -- 改为NVARCHAR类型 AS BEGIN SELECT * FROM [dbo].[Game] -- 拼接通配符时加N前缀确保Unicode兼容,指定排序规则忽略大小写与口音 WHERE [dbo].[Game].[Title] LIKE N'%' + @LikeTitle + N'%' COLLATE Latin1_General_CI_AI; END
2. 确保Unicode字符串匹配
拼接通配符时必须添加N前缀,否则字符串会被当作非Unicode处理,无法正确匹配NVARCHAR类型的Title字段。
二、Id为0、其他字段为空的修复
该问题是Dapper对象映射失败导致,检查以下两点:
1. 核对Game类属性定义
确保类的属性名、类型与数据库列完全匹配(Dapper默认大小写不敏感,严格匹配更稳妥),示例正确的Game类:
public class Game { public int Id { get; set; } public string Title { get; set; } public string Platform { get; set; } }
若属性名与列名不一致,需用[Column]特性指定映射:
using System.ComponentModel.DataAnnotations.Schema; public class Game { [Column("Id")] public int GameId { get; set; } // 若属性名是GameId,映射到数据库Id列 public string Title { get; set; } public string Platform { get; set; } }
2. 显式指定查询列
避免使用SELECT *,改为显式列出列名,减少隐式映射问题:
CREATE PROCEDURE [dbo].[spGame_GetSimilarTitles] @LikeTitle NVARCHAR(100) AS BEGIN SELECT Id, Title, Platform -- 显式指定返回列 FROM [dbo].[Game] WHERE [dbo].[Game].[Title] LIKE N'%' + @LikeTitle + N'%' COLLATE Latin1_General_CI_AI; END
三、额外优化建议
- 若需更精准的模糊匹配,可结合
SOUNDEX或DIFFERENCE函数,但当前排序规则方案更适配带口音的场景。 - 为
Title字段创建带排序规则的非聚集索引,提升查询性能:
CREATE NONCLUSTERED INDEX IX_Game_Title ON [dbo].[Game] (Title COLLATE Latin1_General_CI_AI);
内容的提问来源于stack exchange,提问作者James M
相关产品推荐
相关产品推荐

