应用程序将UI中的5种不同过滤条件传递给查询。即,--STORE CODE DESC NOTES QTY.
当我添加具有不同可能性的这些条件时,它会变得非常长,即
--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 Store=@Store AND Quantity = @Qty';
--11000
ELSE IF @Store<>'0' AND @Code<>'' AND @Description='' AND @Notes='' --AND @Qty<>''
SET @sql += ' AND Store=@Store AND Code=@Code AND Quantity = @Qty';
........................
答案 0 :(得分: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 MyTable.StoreID=@Store)
AND
(@code= IS NULL OR MyTable.CodeID=@Code)
AND
(@DESC IS NULL OR MyTable.Description=@Desc)
AND
(@Notes IS NULL OR MyTable.Notes=@Notes)
如果您不能信任传入的值并且需要基于参数值组合的逻辑,那么创建@ValidFilter标志并简单地添加最终AND @ValidFilter=1
并且不做WHERE
中的内容过多。
答案 1 :(得分: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
. . .
答案 2 :(得分: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)
);
使用动态查询(例如您的查询)可能会导致安全漏洞,以及对如何完成工作的一般混淆。在我看来,它应该是最后一个度假胜地之一。