我正在寻找一种使用可选表参数过滤视图的有效方法。
示例最好,所以这里是一个示例情况:
-- database would contain a view that I want to be able to filter
CREATE VIEW [dbo].[MyView]
AS
BEGIN
-- maybe 20-40 columns
SELECT Column1, Column2, Column3, ...
END
我有这样的用户定义的表类型:
-- single id table for joining purposes (passed from code)
CREATE TYPE [dbo].[SingleIdTable] AS TABLE (
[Id] INT NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC) WITH (IGNORE_DUP_KEY = OFF));
-- double id table for joining purposes (passed from code)
CREATE TYPE [dbo].[DoubleIdTable] AS TABLE (
[Id1] INT NOT NULL,
[Id2] INT NOT NULL,
PRIMARY KEY CLUSTERED ([Id1] ASC, [Id2] ASC) WITH (IGNORE_DUP_KEY = OFF));
我想创建一个基本上如下的存储过程:
CREATE PROCEDURE [dbo].[FilterMyView]
@Parameter1 dbo.SingleIdTable READONLY,
@Parameter2 dbo.DoubleIdTable READONLY,
@Parameter3 dbo.SingleIdTable READONLY
AS
BEGIN
SELECT *
FROM MyView
INNER-JOIN-IF-NOT-EMPTY @Parameter1 p1 ON p1.Id = MyView.Column1 AND
INNER-JOIN-IF-NOT-EMPTY @Parameter2 p2 ON p2.Id1 = MyView.Column5 AND
p2.Id2 = MyView.Column6 AND
INNER-JOIN-IF-NOT-EMPTY @Parameter3 p3 ON p3.Id = MyView.Column8
END
现在我相信我可以使用WHERE EXISTS
执行此操作,但我想确保以最有效的方式为SQL引擎执行此操作。我个人觉得INNER JOIN
语义创建了最优化的执行计划,但我实际上并不知道。
我也知道我可以使用动态SQL来做到这一点,但我总是将其作为最后一个选项。