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

如何简化含group、key、label多筛选条件的Stored Procedure代码?

优化多条件筛选的存储过程代码

我有一个用于搜索筛选的存储过程,包含group、key、label三个关联的搜索筛选器,现有代码通过大量IF分支拼接查询条件,冗余且复杂,原代码如下:

IF (@group <> '' AND @key <> '' AND @label <> '')
BEGIN
    SET @statement =  
        @statement + ' WHERE ([group] LIKE ''%' + @group + '%'' AND [key] LIKE ''%' + @key + '%'' AND [label] LIKE ''%' + @label + '%'')'
END
ELSE IF (@group <> '' AND @key <> '') 
BEGIN
    SET @statement = 
        @statement + ' WHERE ([group] LIKE ''%' + @group + '%'' AND [key] LIKE ''%' + @key + '%'')'
END
ELSE IF (@key <> '' AND @label <> '') 
BEGIN
    SET @statement = 
        @statement + ' WHERE ([key] LIKE ''%' + @key + '%'' AND [label] LIKE ''%' + @label + '%'')'
END
ELSE IF (@label <> '' AND @group <> '') 
BEGIN
    SET @statement = 
        @statement + ' WHERE ([label] LIKE ''%' + @label + '%'' AND [group] LIKE ''%' + @group + '%'')'
END
ELSE IF (@group <> '') 
BEGIN
    SET @statement  
        = @statement + ' WHERE [group] LIKE ''%' + @group + '%'''
END
ELSE IF (@key <> '') 
BEGIN
    SET @statement  
        = @statement + ' WHERE [key] LIKE ''%' + @key + '%'' '
END
ELSE IF (@label <> '') 
BEGIN
    SET @statement  
        = @statement + ' WHERE [label] LIKE ''%' + @label + '%'''
END

优化方案

方案1:动态拼接条件,消除冗余分支

通过逐个判断参数有效性,自动拼接条件和逻辑运算符,无需枚举所有参数组合:

-- 初始化条件存储变量
DECLARE @whereClause NVARCHAR(MAX) = ''

-- 逐个添加筛选条件
IF @group <> ''
    SET @whereClause += CASE WHEN @whereClause <> '' THEN ' AND ' ELSE '' END + '[group] LIKE ''%' + @group + '%'''

IF @key <> ''
    SET @whereClause += CASE WHEN @whereClause <> '' THEN ' AND ' ELSE '' END + '[key] LIKE ''%' + @key + '%'''

IF @label <> ''
    SET @whereClause += CASE WHEN @whereClause <> '' THEN ' AND ' ELSE '' END + '[label] LIKE ''%' + @label + '%'''

-- 若存在有效条件,拼接至主语句
IF @whereClause <> ''
    SET @statement = @statement + ' WHERE ' + @whereClause

方案2:参数化查询(兼顾简洁与安全)

原代码直接拼接字符串存在SQL注入风险,推荐使用参数化动态SQL,同时简化逻辑:

DECLARE @whereClause NVARCHAR(MAX) = ''
DECLARE @params NVARCHAR(MAX) = N'@group NVARCHAR(MAX), @key NVARCHAR(MAX), @label NVARCHAR(MAX)'

-- 拼接参数化条件
IF @group <> ''
    SET @whereClause += CASE WHEN @whereClause <> '' THEN ' AND ' ELSE '' END + '[group] LIKE ''%'' + @group + ''%'''

IF @key <> ''
    SET @whereClause += CASE WHEN @whereClause <> '' THEN ' AND ' ELSE '' END + '[key] LIKE ''%'' + @key + ''%'''

IF @label <> ''
    SET @whereClause += CASE WHEN @whereClause <> '' THEN ' AND ' ELSE '' END + '[label] LIKE ''%'' + @label + ''%'''

-- 拼接主语句
IF @whereClause <> ''
    SET @statement = @statement + ' WHERE ' + @whereClause

-- 执行参数化动态SQL
EXEC sp_executesql @statement, @params, @group = @group, @key = @key, @label = @label

说明

  • 方案1通过逐参数判断的方式,避免了枚举所有参数组合的冗余分支,代码维护性大幅提升。
  • 方案2在简化逻辑的同时,彻底解决了原代码的SQL注入隐患,是生产环境的优先选择。

内容的提问来源于stack exchange,提问作者DevFresh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 14:15:41