首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

存储过程求赐教

2013-08-06 
存储过程求指教--例,一个存储过程只有两个参数 A,B--存储过程执行内容select * from tb where A and B--

存储过程求指教


--例,一个存储过程只有两个参数 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)

热点排行