Dev*_*per 1 sql t-sql sql-server
应用程序从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..........
Run Code Online (Sandbox Code Playgroud)
有没有办法简化这个作为单个查询传递.希望这个问题是可以理解的.
我做的示例代码如下,
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';
Run Code Online (Sandbox Code Playgroud)
........................
我会在查询之外放置任何验证,只需按如下方式过滤您的查询.
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)
Run Code Online (Sandbox Code Playgroud)
如果你不能信任传入的值并且需要一些基于参数值组合的逻辑,那么创建一个@ValidFilter标志并简单地添加一个final AND @ValidFilter=1
并且不会做太多的更可读WHERE
.
归档时间: |
|
查看次数: |
309 次 |
最近记录: |