网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > 数据库 > 正文

动态构建SQL语句之模糊查询

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

我们不管是做B/S还是C/S系统都没遇到查询,模糊查的随便你输的,而且项非常多。这个在电子商务或者ERP系统最常见。

像这样的查询我们可以用存储过程去做,或者使用Stringbuilder去拼接,都是动态构建SQL语句。以下是个人使用SQL Server存储过程写的模糊查询:

  1. --------------------------------------------------------------------------------------- 
  2. /* 
  3.  *作    者:lin sen 
  4.  *功能说明:动态构建SQL语句之模糊查询 
  5.  *编写日期:2010年9月27日 
  6.  * 
  7. */ 
  8. --------------------------------------------------------------------------------------- 
  9. drop procedure proc_selectTeacher 
  10. go 
  11. create procedure proc_selectTeacher 
  12.     @D_ID            int,            --系别编号             
  13.     @T_education    varchar(20),    --学历 
  14.     @T_title        varchar(20),    --职称 
  15.     @T_degree        varchar(10),    --学位 
  16.     @T_IDcard        varchar(20),    --身份证号 
  17.     @T_sex            char(2),        --性别 
  18.     @T_teacherName    varchar(10)     --教师姓名 
  19. as 
  20. begin 
  21.     declare @sql varchar(200) 
  22.     select @sql=' 
  23.             select te.*,de.D_Name  
  24.             from teacher as te,department as de  
  25.             where te.D_ID=de.D_ID and 1=1'     
  26.      
  27.     --系别编号 
  28.     if @D_ID is not null and @D_ID<>'' 
  29.     begin 
  30.         select @sql=@sql+' and de.D_ID=' + cast(@D_ID as varchar
  31.     end 
  32.      
  33.     --学历 
  34.     if @T_education is not null and @T_education<>'' 
  35.     begin 
  36.         select @sql=@sql+' and T_education=''''' + @T_education + '''' 
  37.     end 
  38.  
  39.     --职称 
  40.     if @T_title is not null and @T_title<>'' 
  41.     begin 
  42.         select @sql=@sql+' and T_title=@T_title''''' + @T_title + '''' 
  43.     end 
  44.  
  45.     --学位 
  46.     if @T_degree is not null and @T_degree<>'' 
  47.     begin 
  48.         select @sql=@sql+' and T_degree=''''' + @T_degree + '''' 
  49.     end 
  50.      
  51.     --身份证号 
  52.     if @T_IDcard is not null and @T_IDcard<>'' 
  53.     begin 
  54.         select @sql=@sql+' and T_IDcard=''''' + @T_IDcard + '''' 
  55.     end 
  56.  
  57.     --性别 
  58.     if @T_sex is not null and @T_sex<>'' 
  59.     begin 
  60.         select @sql=@sql+' and T_sex=''''' + @T_sex + '''' 
  61.     end 
  62.      
  63.     --教师姓名 
  64.     if @T_teacherName is not null and @T_teacherName<>'' 
  65.     begin 
  66.         select @sql=@sql+' and T_teacherName like''''' + @T_teacherName +'%'+'''' 
  67.     end 
  68.      
  69.     print @sql    --输出SQL语句 
  70.     exec (@sql)    --试行构建的SQL语句 
  71. end 
  72. go 

 SQL调用:

  1. exec proc_selectTeacher null,null,null,null,null,'男','陈小东' 

上面的存储过程在构建SQL语句的时候注意以下几点,以后方便我们自己写。

1、如果你构建的参数是整形的,用+cast(@D_ID as varchar)。字符串的话是+ '''' + @T_education + '''' ;比如参数是2和本科,exec试行语句时是D_ID=2和T_education='本科',字符串多了单引号。

2、如果你想对某个字段进一步模糊就用:列名 like '参数%';就像上面的教师姓名查询

3、@T_education is not null and @T_education<>'' 前提参数不能为空,为空的话就变成 and T_education=null;

4、挺重要的在where条件加and 1=1;当然有多表连接时可以不写,但是最好写上。

5、多表查询时重复列要指明某表.列名,如de.D_ID。
这个过程只是举个例子,其他地方的做法一样,若其他人有不同做法贴出来一起分享下,或者意见和建议。

由于在Oracle中的execute immediate的查询没有结果体,所以本人目前还不知道怎么实现。就用VS的StrinBuilder来实现Oracle的动态构建SQL语句。

  1.     StringBuilder sb = new StringBuilder();             
  2.     sb.AppendFormat("select te.*,de.D_Name from teacher as te,department as de where te.D_ID=de.D_ID and 1=1");             
  3. if (!string.IsNullOrEmpty(txtDID.Text))//这个可以用实体传入            
  4. {                 
  5.     sb.Append(" de.D_ID='");                 
  6.     sb.Append(txtDID.Text); 
  7.         sb.Append("' and"); 
  8.     }             
  9.     if (!string.IsNullOrEmpty(txtName.Text)) 
  10.     { 
  11.         sb.Append(" de.D_Name='");                 
  12.         sb.Append(txtName.Text); 
  13.         sb.Append("' and"); 
  14.     }    
  15.     if (!string.IsNullOrEmpty(txtEducation.Text)) 
  16.     { 
  17.         sb.Append(" de.D_Education='");                 
  18.         sb.Append(txtEducation.Text); 
  19.         sb.Append("' and"); 
  20.     }            
  21.     //.....             
  22.     OracleConnection Conn = new OracleConnection("配置文件");             
  23.     OracleCommand Cmd = new OracleCommand(sb.ToString(),Conn);             
  24.     //.....             
  25.     //需要的试行命令 

这个有很多地方省略,朋友们可以自己完善或者写出更好的,但是还是那句话道理一样的。

设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师