Member 10379103 Ответов: 1

Оператор Sql с предоставленными пользователем фильтрами


У меня есть отчет, который имеет несколько полей. Пользователи хотят иметь возможность выбирать свои собственные разнообразные условия. Иногда они хотят использовать и, иногда они хотят использовать или, иногда они хотят использовать как, или между, или комбинацию всего этого.

Ниже приведен пример кода того, как я предлагаю это сделать.

Есть ли лучший или более эффективный способ сделать это?


custname  nvarchar(40) = NULL,                   
                 @city      nvarchar(15) = NULL,                   
                 @region    nvarchar(15) = NULL,                   
                 @country   nvarchar(15) = NULL,                   
                 @prodid    int          = NULL,                   
                 @prodname  nvarchar(40) = NULL,              
                 @proddesc varchar(75) =NULL,
                 @prodprice int =NULL,
                 @netcost  int    =NULL,
                 @markup int =NULL,
                 @fromdate datetime =NULL,
                 @todate  datetime =NULL
                 @debug     bit          = 0 AS                    
                                                                   -
DECLARE @sql        nvarchar(4000),                                
        @paramlist  nvarchar(4000)                                 
                                                                   
SELECT @sql =                                                      
   SELECT OrderID, OrderDate, UnitPrice, Quantity,     
            CustomerID, CompanyName, Address, City,       
            Region,  PostalCode, Country, Phone,           
            ProductID, ProductName, UnitsInStock,            
            UnitsOnOrder                                         
     FROM   dbo.Orders
     WHERE  1 = 1                                        
                                                                   
IF @orderid IS NOT NULL                                            
   SELECT @sql = @sql + 'AND OrderID = @orderid
                        
                                                                   
IF @fromdate IS NOT NULL                                           
   SELECT @sql = @sql + ' AND @fromdate
                                                                  
IF @todate IS NOT NULL                                             
   SELECT @sql = @sql + 'AND @todate
                                                                   
IF @minprice IS NOT NULL                                           
   SELECT @sql = @sql + 'AND UnitPrice = @xminprice
                                                                 
IF @maxprice IS NOT NULL                                         
   SELECT @sql = @sql + 'AND UnitPrice  @xmaxprice
                                                                   
IF @custid IS NOT NULL                                            
   SELECT @sql = @sql + '
                        AND CustomerID = @custid
SELECT @sql = @sql + 'ORDER BY OrderID
                                                                  
IF @debug = 1                                                     
   PRINT @sql                                                    
                                                                  
SELECT @paramlist = @orderid   int,                             
                     @Fromdate  datetime,                        
                     @Todate    datetime,                        
                     @minprice  money,                           
                     @maxprice  money,                            
                     @custid    nchar(5),                        
                     @custname  nvarchar(40),                    
                     @city      nvarchar(15),                     
                     @region    nvarchar(15),                     
                     @Country   nvarchar(15),                     
                     @Prodid    int,                              
                     @Prodname  nvarchar(40)  
                                                                   
EXEC sp_executesql @sql, @paramlist,                               
                   @orderid, @fromdate, @todate, @minprice,        
                   @maxprice,  @custid, @custname, @city, @region, 
                   @country, @prodid, @prodname

What I have tried:

I have tried Google search and MSDN

1 Ответов

Рейтинг:
4

Naga Sindhura

Привет,

Вместо того чтобы писать несколько строк кода, попробуйте обратиться к следующему запросу. Я предоставил несколько способов оптимизации вашего запроса, как вы просили в вопросе, и изменить его в соответствии с требованиями.

SELECT OrderID, OrderDate, UnitPrice, Quantity,
         CustomerID, CompanyName, Address, City,
         Region,  PostalCode, Country, Phone,
         ProductID, ProductName, UnitsInStock,
         UnitsOnOrder
  FROM   dbo.Orders
  WHERE @orderid IS NULL OR OrderID = @orderid)
  AND (@custid IS NULL OR AND CustomerID = @custid)
  AND (@custname IS NULL OR AND  LIKE CompanyName like '%'+@custname+'%')
  AND ( (@fromdate IS NULL OR OrderDate >= @fromdate)OR(@todate IS NULL OR OrderDate <= @todate)OR
        ((@fromdate IS NULL AND @todate IS NULL) OR OrderDate BETWEEN @fromdate AND @todate))
  AND ( (@minprice IS NULL OR UnitPrice >= @minprice)OR(@todate IS NULL OR UnitPrice <= @maxprice)OR
      ((@minprice IS NULL AND @maxprice IS NULL) OR UnitPrice BETWEEN @minprice AND @maxprice))
  ORDER BY OrderID