含多项查询条件的存储过程(SQL2008)

 在做一个搜索时,有多项搜索条件,如果这么多条件单独在程序里判断是很麻烦的。今天花几个小时的时间才做好这个存储过程,用这么长别笑话我笨啊,呵呵,发现很多基础的语法都忘了,当然用SQL2008也发现了些新问题。

原理:把条件进行字符串拼接,就是判断传入的各个条件,如果传入符合条件的值了,则在拼接此条件语句,否则不拼接此条件。也就是我在页面上存在多条件查找时,如果一个文本框里不输入值了,则传入空字符串,存储过程判断如果是空字符串就不拼接此条件,此时在写代码时,省了很多判断。

详细代码如下所示,这里对代码需要注意的地方说下,也是我在做时出问题的地方: 

1、如果数据库是数字类型,需要利用CONVERT(varchar(8000),@AppID)转换为字符串,如下代码中的:@strWhere=@strWhere+' and AppID='+CONVERT(varchar(8000),@AppID) 

2、在数据库4个单撇号才翻译成一个单撇号,在进行字符串相等匹配时要注意前后有个单撇号,如下代码中的:@strWhere=@strWhere+' and UserIP='+''''+@UserIP+'''' 当然也可以这么写@strWhere=@strWhere+' and UserIP='''+@UserIP+'''' 原因是在字符串常量中要输出一个单撇号,需要写2个单撇号,如要输出I'm a student 需要写成select 'I''m a student'  

3、字符串模糊匹配别忘'%搜索内容%'前后的单撇号 如下代码中的:@strWhere=@strWhere+' and UserName like '+''''+'%'+@UserName+'%'+''''  为了阅读方便我把常量字符串%单独拿出来,对于常量字符串前后有单撇号括起来 

4、对于ntext类型进行字符串拼接时,必须转换为varchar否则出现“ntext 和varchar 在equal to 运算符中不兼容”的错误提示,如下代码中的:@strWhere=@strWhere+' and PageUrl like '''+'%'+''+CONVERT(varchar(8000),@PageUrl)+''+'%''' 

5、对于日期字段本来我想传入的是日期类型,所以直接进行比较,但结果没成功。原因是此处为进行字符串拼接,所以首先需要把传入的日期参数转化为字符串(如下面的:CONVERT(varchar(100),@StartLogTime,23)),然后再把此字符串转化为日期,当然这里的转化函数需要写到字符串常量里。如下面的:@strWhere=@strWhere+' and LogTime>=cast('+''''+CONVERT(varchar(100),@StartLogTime,23)+''''+' as datetime) ' 比如传入的日期为2010-12-01,则最后形成的SQL语句是:and LogTime>=cast('2010-12-01' as datetime)

 

USE [SRLogDB]

GO

 

SET ANSI_NULLS ON

GO

 

SET QUOTED_IDENTIFIER ON

GO

 

------------------------------------

--用途:查询记录信息

 

------------------------------------

CREATE PROCEDURE [dbo].[Proc_Operation_Log_GetList]

@AppID int,

@UserName nvarchar(50),

@UserIP nvarchar(15),

@PageUrl ntext,

@Type nvarchar(100),

@StartLogTime datetime,

@EndLogTime datetime

 AS

 declare @strWhere varchar(8000)

 declare @minDate datetime

 declare @maxDate datetime

 

 set @strWhere=''

 set @minDate=CAST('1753-01-01' as datetime)

 set @maxDate=CAST('9999-12-31' as datetime)

 

 --数字类型匹配

 if @AppID>0

 begin 

    set @strWhere=@strWhere+' and AppID='+CONVERT(varchar(8000),@AppID)

 end

 

 --字符类型模糊查找

 if @UserName<>''

 begin

    set @strWhere=@strWhere+' and UserName like '+''''+'%'+@UserName+'%'+''''

 end

 

 --字符类型完全匹配

 if @UserIP<>''

 begin

    set @strWhere=@strWhere+' and UserIP='+''''+@UserIP+''''

 end

 

 --@PageUrntext类型,必须类型转换否则出现lntext varchar equal to 运算符中不兼容的问题

 if CONVERT(varchar(8000),@PageUrl)<>''

 begin

    set @strWhere=@strWhere+' and PageUrl like '''+'%'+''+CONVERT(varchar(8000),@PageUrl)+''+'%'''

 end

 

 --日期比较

 if @StartLogTime >@minDate

 begin

     set @strWhere=@strWhere+' and LogTime>=cast('+''''+CONVERT(varchar(100),@StartLogTime,23)+''''+' as datetime) '

 end

 

 if @StartLogTime <@maxDate

 begin

     set @strWhere=@strWhere+' and LogTime<=cast('+''''+CONVERT(varchar(100),@EndLogTime,23) +''''+' as datetime) '

 end

 declare @strMain varchar(8000)

 set @strMain='   SELECT ID,UserID,UserName,UserIP,AppID,AppIP,Type,TypeDesc,PageForm,PageState,ObjectID,ObjectName,ObjectDesc,PageUrl,Result,ResultMsg,LogTime,ServerLogTime

              FROM [Operation_Log]

              WHERE 1=1'+@strWhere

 exec(@strMain)

GO

 

 

 

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值