這樣做有它的兩種可能的方式。
1 - 將列名傳遞給過程並動態構建查詢。
CREATE PROCEDURE Get_Data
@fieldToFilter SYSNAME --Will only be 1 of these values 'Order Date', 'Delivery Date' or 'Dispatch Date'
,@StartDate DATE
,@EndDate DATE
AS
BEGIN
SET NOCOUNT ON;
Declare @Sql NVARCHAR(MAX);
SET @Sql = N' SELECT o.Number, o.Customer
FROM [Order] o
WHERE (o.'+QUOTENAME(@fieldToFilter)+' > @StartDate)
and (o.'+QUOTENAME(@fieldToFilter)+' < @EndDate)
and (SoftDeleted=0) '
Exec sp_executesql @Sql
,N'@StartDate DATE, @EndDate DATE'
,@StartDate
,@EndDate
END
2 - 你的每列1添加paramaeter,設定值要應用的過濾器,這也使您能夠在所有應用多個過濾器或者根本沒有選擇。
CREATE PROCEDURE Get_Data
@FilterOnOrderDate BIT = NULL
,@FilterOnDeliveryDate BIT = NULL
,@FilterOnDispatchDate BIT = NULL
,@StartDate DATE = NULL
,@EndDate DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
Declare @Sql NVARCHAR(MAX);
SET @Sql = N' SELECT o.Number, o.Customer
FROM [Order] o
WHERE (SoftDeleted=0) '
+ CASE WHEN @FilterOnOrderDate = 1 THEN
N' AND (o.OrderDate > @StartDate)
AND (o.OrderDate < @EndDate) ' ELSE N'' END
+ CASE WHEN @FilterOnDeliveryDate = 1 THEN
N' AND (o.DeliveryDate > @StartDate)
AND (o.DeliveryDate < @EndDate) ' ELSE N'' END
+ CASE WHEN @FilterOnDispatchDate = 1 THEN
N' AND (o.DispatchDate > @StartDate)
AND (o.DispatchDate < @EndDate) ' ELSE N'' END
Exec sp_executesql @Sql
,N'@StartDate DATE, @EndDate DATE'
,@StartDate
,@EndDate
END
M2c構成 - 這裏有根本的兩種方法:一種是查詢優化器可以優化和一個它不能....根據您的要求後者可能不被接受。我會問的問題是什麼促使要求能夠過濾通用字段?實現三個不同的查詢(不管你覺得最易於管理)將提供最佳的優化機會。 –