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

如何在SQL Server存储过程中根据变量值设置查询条件?

SQL Server存储过程中实现动态WHERE子句的解决方案

下面提供两种实用的方案来实现你需要的动态WHERE条件逻辑:

方案一:静态逻辑条件拼接(推荐,无动态SQL)

这种方式不需要构建动态SQL字符串,直接通过逻辑运算符组合条件,既安全又能让SQL Server重用执行计划,性能更稳定。

存储过程示例:

CREATE PROCEDURE GetEvents
    @EventId INT
AS
BEGIN
    SET NOCOUNT ON;

    SELECT *
    FROM tbl_event
    -- 核心逻辑:当@EventId为0时筛选所有非0的event_id,否则匹配指定的@EventId
    WHERE (@EventId = 0 AND event_id != @EventId) 
       OR (@EventId != 0 AND event_id = @EventId);
END

你也可以简化WHERE子句,逻辑完全等价:

WHERE event_id = @EventId OR (@EventId = 0 AND event_id != 0)

方案二:动态SQL(适合复杂动态场景)

如果后续需要扩展更复杂的动态条件,可以使用动态SQL,但必须通过sp_executesql传入参数来避免SQL注入风险。

存储过程示例:

CREATE PROCEDURE GetEvents_Dynamic
    @EventId INT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @SQL NVARCHAR(MAX);
    DECLARE @Params NVARCHAR(MAX) = N'@EventId INT';

    -- 根据@EventId构建WHERE子句
    IF @EventId = 0
        SET @SQL = N'SELECT * FROM tbl_event WHERE event_id != @EventId';
    ELSE
        SET @SQL = N'SELECT * FROM tbl_event WHERE event_id = @EventId';

    -- 执行动态SQL并传入参数
    EXEC sp_executesql @SQL, @Params, @EventId = @EventId;
END

两种方案对比

  • 方案一:性能更优,无SQL注入风险,执行计划可重用,适合简单的动态条件场景。
  • 方案二:灵活性更高,适合后续需要添加更多动态筛选规则的场景,但需要严格遵循参数化规范避免注入,执行计划可能无法重用(可通过优化器设置调整)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:20:34