Tôi nhận thức được các vấn đề đánh hơi tham số liên quan đến các thủ tục được lưu trữ được viết bằng một vị từ như sau:
CREATE PROCEDURE [dbo].[Get] @Parameter INT = NULL AS BEGIN;
SELECT [Field] FROM [dbo].[Table]
WHERE [Field] = @Parameter
OR @Parameter IS NULL;
END;
Tùy thuộc vào giá trị của tham số, vô hướng hoặc NULL trong lần thực hiện đầu tiên, một kế hoạch được lưu trong bộ nhớ cache có khả năng sẽ là tối ưu phụ cho giá trị ngược lại.
Giả sử [Trường] là vô hướng và chỉ mục phân cụm trên bảng. Những ưu và nhược điểm của các cách tiếp cận sau đây để viết (các) thủ tục được lưu trữ để hỗ trợ truy vấn:
Chọn điều kiện trong cùng một thủ tục lưu trữ
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;
SQL động trong thủ tục được lưu trữ
CREATE PROCEDURE [dbo].[Get] @Parameter INT = NULL AS BEGIN;
DECLARE @sql NVARCHAR(MAX) = N'';
SET @sql += N'SELECT [Field]'
SET @sql += N'FROM [dbo].[Table]';
IF(@Parameter IS NOT NULL) BEGIN;
@sql += N'WHERE [Field] = @Parameter';
END;
SET @sql += N';';
EXEC sp_executesql @sql N'@Parameter INT', @Parameter;
END;
Thủ tục lưu trữ riêng
CREATE PROCEDURE [dbo].[Get] @Parameter INT = NULL AS BEGIN;
SELECT [Field]
FROM [dbo].[Table]
WHERE [Field] = @Parameter;
END;
CREATE PROCEDURE [dbo].[GetAll] AS BEGIN;
SELECT [Field]
FROM [dbo].[Table];
END;
=NULL
sẽ trả về 0 hàng. Mặc dù các ước tính hàng không thường được làm tròn lên tới 1