You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 17:20:26