基于FilterSub_ID点击事件动态生成SQL查询实现产品列表展示
动态生成基于FilterSub_ID点击的产品列表SQL查询
需求背景
根据用户在过滤器中对FilterSub_ID(隶属于all_filters表)的点击操作,动态调整SQL查询语句,以此展示匹配条件的产品列表。
现有数据表结构
| 数据表名 | 字段名 | 说明 |
|---|---|---|
dbo.Cat_Main | Cat_Main_ID | 主分类ID(主键) |
Cat_Main_name | 主分类名称 | |
dbo.Cat_Sub | Cat_Sub_ID | 子分类ID(主键) |
Cat_Main_ID | 关联主分类的外键 | |
dbo.FiltersMain | FilterMain_ID | 过滤器主项ID(主键) |
FilterMain_Name | 过滤器主项名称 | |
dbo.FiltersSub | FilterSub_ID | 过滤器子项ID(主键) |
FilterMain_ID | 关联过滤器主项的外键 |
动态SQL实现思路
这里假设你有一个存储产品信息的表dbo.Products(如果表名/字段不同,自行替换),核心逻辑是捕获用户点击的FilterSub_ID集合,然后关联所有相关表生成查询:
- 第一步:捕获用户点击的
FilterSub_ID,支持单个或多个选择(多选场景更常见) - 第二步:通过关联过滤器表、分类表和产品表,筛选出匹配条件的产品
- 第三步:避免SQL注入风险,优先使用安全的参数化查询方式
示例代码
方式1:字符串拼接(适合简单场景,注意注入风险)
-- 模拟用户点击的FilterSub_ID集合,实际开发中替换为前端传入的参数 DECLARE @SelectedFilterSubIDs VARCHAR(MAX) = '2,4,6' DECLARE @DynamicSQL NVARCHAR(MAX) SET @DynamicSQL = N' SELECT p.Product_ID, p.Product_Name, p.Price -- 替换为你需要展示的产品字段 FROM dbo.Products p -- 关联分类表,根据你的产品表关联逻辑调整 JOIN dbo.Cat_Sub cs ON p.Cat_Sub_ID = cs.Cat_Sub_ID JOIN dbo.Cat_Main cm ON cs.Cat_Main_ID = cm.Cat_Main_ID -- 关联过滤器表,这里假设过滤器子项和主分类关联,根据实际业务调整关联条件 JOIN dbo.FiltersSub fs ON fs.FilterMain_ID = /* 这里填写过滤器和分类/产品的关联逻辑,比如cm.Cat_Main_ID对应的过滤器主项ID */ WHERE fs.FilterSub_ID IN (' + @SelectedFilterSubIDs + ') ' -- 执行动态SQL EXEC sp_executesql @DynamicSQL
方式2:表值参数(推荐,完全避免SQL注入)
-- 先定义一个表值参数类型(只需创建一次) CREATE TYPE FilterSubIDList AS TABLE (FilterSub_ID INT) -- 模拟用户选择的FilterSub_ID DECLARE @SelectedIDs FilterSubIDList INSERT INTO @SelectedIDs VALUES (2), (4), (6) -- 安全的参数化查询 SELECT p.Product_ID, p.Product_Name, p.Price FROM dbo.Products p JOIN dbo.Cat_Sub cs ON p.Cat_Sub_ID = cs.Cat_Sub_ID JOIN dbo.Cat_Main cm ON cs.Cat_Main_ID = cm.Cat_Main_ID JOIN dbo.FiltersSub fs ON /* 填写实际关联条件 */ -- 通过表值参数筛选 JOIN @SelectedIDs s ON fs.FilterSub_ID = s.FilterSub_ID
注意事项
- 请根据你的实际业务逻辑调整表之间的关联条件(比如过滤器子项是直接关联产品,还是关联分类)
- 如果用户没有选择任何过滤器,可以默认返回全部产品,只需在SQL中添加判断逻辑即可
- 生产环境中强烈推荐使用表值参数或参数化查询,避免SQL注入攻击
内容的提问来源于stack exchange,提问作者Freddakos
相关产品推荐
相关产品推荐

