Clark Chan

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  66 随笔 :: 0 文章 :: 183 评论 :: 4 引用

【原创源码】(02):通用查询存储过程,可应用于多表关联的动态条件查询。

欢迎大家发表意见(漏洞,性能等)。在博客园社区以外转载请注明作者和出处。谢谢

1,创建数据表:

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Demo]'and OBJECTPROPERTY(id, N'IsUserTable'= 1)
drop table [dbo].[Demo]
GO

CREATE TABLE [dbo].[Demo] (
 
[DemoId] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
 
[DemoName] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
 
[ListPrice] [decimal](180NULL ,
 
[Quantity] [int] NULL ,
 
[LastUpdatedDate] [datetime] NULL 
ON [PRIMARY]
GO

ALTER TABLE [dbo].[Demo] WITH NOCHECK ADD 
 
CONSTRAINT [PK_ApplePie] PRIMARY KEY  CLUSTERED 
 (
  
[DemoId]
 )  
ON [PRIMARY] 
GO

2,创建存储过程:

CREATE         procedure usp_selectDemo 
@DemoId varchar(50= null,
@DemoName varchar(50= null,
@ListPrice decimal = null,
@Quantity int = null,
@LastUpdatedDate datetime = null,
@LastUpdatedDateBegin datetime = null,
@LastUpdatedDateEnd datetime = null

as

--select * from demo
--
usp_selectDemo '1'

/* Powered by taeheelive@hotmail.com 
declare @sql varchar(500)
set @sql = ' select DemoId, DemoName, ListPrice, Quantity, LastUpdatedDate from Demo where 1=1'

if @DemoId is not null
begin set @sql = @sql + ' AND DemoId = '''+@DemoId+''''  end

if @DemoName is not null
begin set @sql = @sql + ' AND DemoName = '''+@DemoName+'''' end

if @ListPrice is not null
begin set @sql = @sql + ' AND ListPrice = '+convert(varchar(10),@ListPrice)+'' end

if @Quantity is not null
begin set @sql = @sql + ' AND Quantity = '+convert(varchar(10),@Quantity)+'' end

if @LastUpdatedDate is not null
begin set @sql = @sql + ' AND LastUpdatedDate = '''+convert(varchar(10),@LastUpdatedDate,120)++''' ' end

if @LastUpdatedDateBegin is not null
begin set @sql = @sql + ' AND LastUpdatedDate >= '''+convert(varchar(10),@LastUpdatedDateBegin,120)++''' ' end

if @LastUpdatedDateEnd is not null
begin set @sql = @sql + ' AND LastUpdatedDate < '''+convert(varchar(10),@LastUpdatedDateEnd,120)+''' ' end

--print (@sql)
exec (@sql)
*/


/* Powered by 江千帆(cnblogs.com) */
SELECT DemoId, DemoName, ListPrice, Quantity, LastUpdatedDate FROM Demo
 
where 1=1 
and (@DemoId is null or DemoId = @DemoId)
and (@DemoName is null or DemoName = @DemoName)
and (@ListPrice is null or ListPrice = @ListPrice)
and (@Quantity is null or Quantity = @Quantity)
and (@LastUpdatedDate is null or LastUpdatedDate = @LastUpdatedDate)
and (@LastUpdatedDateBegin is null or LastUpdatedDate >= @LastUpdatedDateBegin)
and (@LastUpdatedDateEnd is null or LastUpdatedDate < @LastUpdatedDateEnd)


GO

3,查询方法:

查询所有记录:usp_selectDemo
查询DemoId='1'的记录:usp_selectDemo '1'
查询DemoName='maxdemo'的记录:usp_selectDemo null,'maxdemo'
等等。

4,Sorry~! 临时修改了5处Bug
change '+@ListPrice+''   to   mailto:'+@ListPrice+''
change mailto:'+@ListPrice+''   to   mailto:'+@ListPrice+''
change '''+@LastUpdatedDate+'''   to   mailto:'+@ListPrice+''
change '''+@LastUpdatedDateBegin+'''   to   mailto:'+@ListPrice+''
change '''+@LastUpdatedDateEnd+'''   to   mailto:'+@ListPrice+''
汗~~,类型转换写的好差,不知哪位高手愿意补完美。谢谢!
ps:为什么上面的字都是当成蓝色的email了,不晓得怎么去掉蓝色和底线,郁闷中。
2006-10-18

5,个人感觉是比较好的一个思路,特大胆放到首页,希望大家讨论哈,优缺点。谢谢!
灵感来自于master数据库中的存储过程“sp_tables”
2006-10-19

6,添加一段数据访问层的应用代码SQLServerDAL,PetShop4.0结构

2006-10-19

7,存储过程添加了/* Powered by 江千帆(cnblogs.com) */的方法(默认方法),
因为感觉比我的要优秀,感谢江千帆的意见!2006-10-19

 
注意!在博客园社区以外转载,必须注明:
作者:Clark Chan
和原文出处:http://clarkchan.cnblogs.com/
否则谢绝转载!

posted on 2006-10-18 15:27 Clark Chan 阅读(1594) 评论(15)  编辑 收藏 网摘 所属分类: 【原创源码】

评论

#1楼  2006-10-18 18:21 高海东      
不错
  回复  引用  查看    

#2楼  2006-10-19 09:57 daydayup [未注册用户]
汗... 这样的文章
还这么特意的注明 转载请注明出处


  回复  引用    

#3楼 [楼主] 2006-10-19 10:28 无赖.net      
@daydayup
因为是原创的源代码,虽然挺简单的!!(料到可能被拍砖,所以昨天仅在新手区贴了,今天转到首页希望大家给点意见。)
但思想来自于个人,非抄袭的想法,
如果仅仅转载文章,非学习方法,难道不该尊重原创吗?
也许我的理解没你高吧~~现在的我认为通过自己的思想得到的东西是可以贴上那句话的。

最初是视图的通用查询,后来发觉性能很低,于是想到能用别的方法吗?
试试存储过程,存储过程能避免视图的2次查询,提高速度,然后偶遇“系统的存储过程sp_tables”,就写出了此方法。
  回复  引用  查看    

#4楼  2006-10-19 11:09 嘻哈呵嘿      
nice topic...
  回复  引用  查看    

#5楼  2006-10-19 11:30 江千帆 [未注册用户]
另外一种方法,呵呵
select * from mytable where (column1=@parameter1 or @parameter1 is null)
  回复  引用    

#6楼  2006-10-19 11:40 DELL网站 [未注册用户]
好文章,学习中
  回复  引用    

#7楼 [楼主] 2006-10-19 13:11 无赖.net      
@江千帆
不错啊!确实又一种方法!非常感谢指教~!
仔细试验了哈,成功!你的方法比我的优秀,避免了类型转换!!

ps:我把你的方法也贴上,供大家参考,默认你的方法。
只是作了如下修改:
Change (column1=@parameter1 or @parameter1 is null)
to (@parameter1 is null or column1=@parameter1)
感觉会增加速度(个人想像SQLServer 和 C#程序一样,遇到第一个条件为真,将不再判断第二个条件。仅仅在参数不为空的时候,判断第二个条件。)


  回复  引用  查看    

#8楼  2006-10-23 11:06 生米煮成稀饭      
晕,这有什么好放首页的啊……
  回复  引用  查看    

还行啊
  回复  引用    

CREATE PROCEDURE dbo.GetKcBMList
(
@SRow NVarChar(30),
@SKey NVarChar(50),
@pagesize int,
@pageindex int,
@docount bit)
as
set nocount on

declare @strFilter NVarChar(1000)
declare @PageLowerBound int
declare @PageUpperBound int
set @PageLowerBound=(@pageindex-1)*@pagesize
set @PageUpperBound=@PageLowerBound+@pagesize


set @strFilter=''
if(@SKey<>'' and @SRow<>'')
set @strFilter=@strFilter+' where ('+@SRow+' like ''%'+@SKey+'%'' )'


--SELECT TOP 1000 CID, TUname, UTel, UWord, KcTitle, KcID, CDate, CoName, CoID FROM KcBM
if(@docount=1)
exec('select count(CID) from KcBM '+@strFilter)
else
begin
exec('
declare @indextable table(id int identity(1,1),nid int)
set rowcount '+@PageUpperBound+'
insert into @indextable(nid) select CID from KcBM '+@strFilter+' order by cid desc
select O.* from KcBM O,@indextable t where O.CID=t.nid and t.id>'+@PageLowerBound+' and t.id<='+@PageUpperBound)
end
set nocount off
GO

  回复  引用    

#11楼  2008-07-24 10:43 mikel      
改了一下存储过程,让其支持模糊查询字符类型的列值:


SET @DemoName = '%'+RTRIM(@DemoName) + '%';

SELECT DemoId, DemoName, ListPrice, Quantity, LastUpdatedDate FROM Demo
where 1=1
and (@DemoId is null or DemoId = @DemoId)
and (@DemoName is null or DemoName Like @DemoName)
and (@ListPrice is null or ListPrice = @ListPrice)
and (@Quantity is null or Quantity = @Quantity)
and (@LastUpdatedDate is null or LastUpdatedDate = @LastUpdatedDate)
and (@LastUpdatedDateBegin is null or LastUpdatedDate >= @LastUpdatedDateBegin)
and (@LastUpdatedDateEnd is null or LastUpdatedDate < @LastUpdatedDateEnd)

  回复  引用  查看    

#12楼 [楼主] 2008-09-08 18:26 Clark Chan      
@mikel
Good

  回复  引用  查看    

#13楼  2008-09-09 08:10 mikel      
又修改了一下,加入了分页查询:
CREATE PROCEDURE [dbo].[Tang_AreaSelect]
@PageSize int=0,
@CurrentPage int=1,
@Identifier int=NULL,
@AreaName nvarchar(50)=NULL
AS
BEGIN
SET NOCOUNT ON;
IF (NOT @AreaName IS NULL) SET @AreaName='%'+@AreaName+'%'

IF (@PageSize>0)
BEGIN
DECLARE @TotalPage int
SELECT @TotalPage=Count(Identifier) FROM Tang_Area WHERE(@Identifier IS NULL OR Identifier=@Identifier)AND
(@AreaName IS NULL OR AreaName Like @AreaName)
IF(@TotalPage%@PageSize=0)
BEGIN
SET @TotalPage=@TotalPage/@PageSize
END
ELSE
BEGIN
SET @TotalPage=Round(@TotalPage/@PageSize,0)+1
END
SELECT TOP (@PageSize) Identifier,AreaName,@TotalPage as totalPage FROM Tang_Area WHERE Identifier NOT IN (SELECT Top (@PageSize*(@CurrentPage-1))Identifier FROM Tang_Area WHERE (@Identifier IS NULL OR Identifier=@Identifier)AND
(@AreaName IS NULL OR AreaName Like @AreaName))AND(@Identifier IS NULL OR Identifier=@Identifier)AND
(@AreaName IS NULL OR AreaName Like @AreaName)
END
ELSE
BEGIN
SELECT Identifier,AreaName FROM Tang_Area WHERE (@Identifier IS NULL OR Identifier=@Identifier)AND
(@AreaName IS NULL OR AreaName Like @AreaName)
END
END


  回复  引用  查看    

#14楼  2008-10-05 21:52 ghd2004      
学习
  回复  引用  查看    





标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-07-20 18:07 编辑过
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: