我知道与使用如下谓词编写的存储过程相关的参数嗅探问题:
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)