这样做有它的两种可能的方式。
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构成 - 这里有根本的两种方法:一种是查询优化器可以优化和一个它不能....根据您的要求后者可能不被接受。我会问的问题是什么促使要求能够过滤通用字段?实现三个不同的查询(不管你觉得最易于管理)将提供最佳的优化机会。 –