小编M. *_*son的帖子

字段 = 参数 OR 参数是 NULL 模式

我知道与使用如下谓词编写的存储过程相关的参数嗅探问题:

CREATE PROCEDURE [dbo].[Get] @Parameter INT = NULL AS BEGIN;
    SELECT [Field] FROM [dbo].[Table]
    WHERE [Field] = @Parameter 
    OR @Parameter IS NULL;
END;
Run Code Online (Sandbox Code Playgroud)

根据参数的值,第一次执行时是标量还是 NULL,一个计划被缓存,对于相反的值可能是次优的。

假设 [Field] 是标量,并且是表上的聚簇索引。以下编写存储过程以支持查询的方法的优缺点是什么:

同一个存储过程中的条件选择

CREATE PROCEDURE [dbo].[Get] @Parameter INT = NULL AS BEGIN;
    IF(@Parameter IS NOT NULL) BEGIN;
        SELECT [Field]
        FROM [dbo].[Table]
        WHERE [Field] = @Parameter;
    END;
    ELSE BEGIN;
        SELECT [Field]
        FROM [dbo].[Table];
    END;
END;
Run Code Online (Sandbox Code Playgroud)

存储过程中的动态 SQL

CREATE PROCEDURE [dbo].[Get] @Parameter INT = NULL AS BEGIN;
    DECLARE @sql NVARCHAR(MAX) = N'';
    SET @sql += N'SELECT …
Run Code Online (Sandbox Code Playgroud)

sql-server execution-plan plan-cache

7
推荐指数
3
解决办法
2882
查看次数

标签 统计

execution-plan ×1

plan-cache ×1

sql-server ×1