日期:2014-05-17  浏览次数:20710 次

存储过程求指教

--例,一个存储过程只有两个参数 A,B
--存储过程执行内容
select * from tb where A= and B=

--A,B两个参数可以传递'全部'
--如:当A传递是'全部' 的时候,那么where 条件 A就无效

--那如果这样的话,两个参数都可以传递'全部'那么就有4种情况
    A      B
1.全部
2.        全部
3.全部      全部
4.

--当第一种参数传递时:
执行select *from tb where B=@B

--当第二种参数传递时:
执行select *from tb where A=@A

--当第三种参数传递时:
执行select *from tb 

--当第四种参数传递时:
执行select *from tb where B=@B and B=@B

--这样的话,存储过程使用IF,判断条件就很多,更何况参数不止两个,有木有更好的解决办法呢?

------解决方案--------------------
SELECT * FROM [tb] 
WHERE A=CASE WHEN @a='all' THEN A ELSE @a END ..

------解决方案--------------------
select * from tb 
where (ISNULL(@A, '') = '' OR A=@A)
and (ISNULL(@B, '') = '' OR B=@B)

------解决方案--------------------
--如何考虑性能的话,参考如下,能用上A,B字段的索引,且实现参数化查询。推荐
CREATE PROC up_test
@A INT,
@B INT
AS  
DECLARE @sql NVARCHAR(max)
SET @sql = N'select * from tb WHERE 1 = 1 '
IF (ISNULL(@A, '') <> '')
SET @sql = @sql+' and A = @A '
IF (ISNULL(@B, '') <> '')
SET @sql = @sql+' and B = @B '

EXEC sp_executesql @sql, N'@A int, @B int', @A, @B

GO


------解决方案--------------------
select * from tb where A=isnull(@a,a) and B=isnull(@b,b)

这两个参数如果不传就默认为null
------解决方案--------------------
select *from tb where (@A is null or A=@A) and(@B is null or B=@B)