如何简化含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
相关产品推荐
相关产品推荐

