2016-12-13 3 views
1

Приложение передает 5 различных условий фильтра из пользовательского интерфейса в запрос. т.е. --STORE CODE DESC NOTES QTY.сложные условия фильтра с SQL-запросом

Когда я добавляю эти условия с разными возможностями он приходит очень долго, то есть

--1 0 0 0 0 
IF @Store<>'0' AND @code='' AND @DESC='' AND @Notes='' AND @QTY=0 
--1 1 0 0 0 
--1 1 0 0 1 
--1 1 1 0 0 
--1 1 1 1 0 
etc.......... 

есть ли способ, чтобы упростить это передать в качестве одного запроса. Надеюсь, этот вопрос понятен.

Пример кода я сделал, как показано ниже,

SET @sql = 'Select * from tbl_store Where Inactive=0 '; 
--10000 
    IF @Store<>'0' AND @Code='' AND @Description='' AND @Notes='' --AND @Qty<>'' 
    SET @sql += ' AND [email protected] AND Quantity = @Qty'; 

    --11000 
    ELSE IF @Store<>'0' AND @Code<>'' AND @Description='' AND @Notes='' --AND @Qty<>'' 
    SET @sql += ' AND [email protected] AND [email protected] AND Quantity = @Qty'; 

........................

ответ

7

Я бы на место любой проверки за пределами запроса и просто фильтровать запрос следующим образом.

SET @IsValidFilter=<YOUR VALIDATION LOGIC HERE>--IF YOU CAN'T TRUST INCOMING VALUES 

SELECT 
    * 
FROM 
    MyTable 
WHERE 
    (@IsValidFilter=1) 
    AND 
    (@Store IS NULL OR [email protected]) 
    AND 
    (@code= IS NULL OR [email protected]) 
    AND 
    (@DESC IS NULL OR [email protected]) 
    AND 
    (@Notes IS NULL OR [email protected]) 

Если вы не можете доверять значения, передаваемых в и нуждаются в логику, основанную на комбинации значений параметров, то было бы более удобным для чтения, чтобы создать флаг @ValidFilter и просто добавить последний AND @ValidFilter=1 и не делать слишком много в WHERE.

+0

спасибо, это то, что я искал .. – Developer

+0

Рад, что я мог помочь. –

1

У них один в то время:

SET @sql = 'Select * from tbl_store Where Inactive = 0 '; 
IF @Store <> '0' 
    SET @sql += ' and Store = @Store'; 
IF @Qty <> '' 
    SET @sql += ' and Quantity = @Qty'; 
. . . . 

По соображениям производительности, то, что вы делаете, является хорошей идеей. Если имеется соответствующий индекс, конечный пункт where должен иметь возможность использовать соответствующие индексы. Один where условия, такие как это не будет:

where (@store = '0' or start = @store) and 
     (@qty = '' or quantity = @qty) and 
     . . . 
1

я покончила бы с динамическим запросом, если это возможно, и сделать что-то вроде этого:

select * 
from tbl_store ts 
where ts.Inactive = 0 
and (
    (@Store <> '0' and @Description = '' and @Notes = '' and Store = @Store and Quantity = @Qty) 
or 
    (@Store <> '0' and @Code <> '' and @Notes <> '' and Code = @Code and Store = @Store and Quantity = @Qty) 
); 

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

Смежные вопросы