前一个贴子已经回你了.很简单.我假设,你存储过程的两个参数为 @p1,@p2 那么依具你存储过程中的写法,也有不同的写法. 
SQL code--1,若是采用动态语句
declare @sql varchar(1000)
set @sql='select * from tb where 1=1 '
if @p1 is not null
  set @sql=@sql + ' and field1=' + @p1
if @p2 is not null
  set @sql=@sql + ' and field2=' + @p2--2,若是采用的非动态语句select * from tb 
  where field1=case when @p1 is null then field1 else @p1 end
       and field2=case when @p2 is null then field2 else @p2 end
假设在c#中实现, 那么也就类似于动态语句的实现方式string sql="select * from tb where 1=1 ";
if(Request["p1"]!=null)
{
  sql += " and field1='" + Request["p1"].ToString() + "'";
}
if(Request["p2"]!=null)
{
  sql += " and field2='" + Request["p2"].ToString() + "'";
}
//这样做不太好,需要对 Request的参数做安全性检测

解决方案 »

  1.   

    如果c#实现的话, 建议, 
    1,采用存储过程来处理
    2,采用带参数的SQL语句来处理如果采用存储过程,那么参数如何处理,我上面说了,
    如果采用带参数的SQL语句,那么写法写类似string sql=" select * from tb where field1=isnull(@p1,field1) and field2=isnull(@p2,field2)";
    SqlParameters parameters= new .....();
    parameters.Add(....)
    ..
    SqlHelper.ExeNo....(sql,parameters,....);用case when或isnull都一样,目都都是当某个参数为null时,将待比较字段与自身比较,就相当于不检测这个条件了.不过case when 会有更多的扩充性.
      

  2.   

    我倒建议使用邦定变量strsql="select * from t where 1=1 and id=@p"根据数据库执行SQL的原理,这个最适合在多客户端频繁查询同一数据表的情况,因为忙得时候DBMS会省去解析过程
      

  3.   

    我倒建议使用邦定变量 strsql="select * from t where 1=1 and id=@p" 根据数据库执行SQL的原理,这个最适合在多客户端频繁查询同一数据表的情况,因为忙得时候DBMS会省去解析过程这样当@p为null时
    执行的是 select * from t where id is null
    而楼主的意图是当@p为null时
    执行的是 select * from t  --即不检索id=@p这个条件.与楼主意图根本冲突.
    为了所谓的性能,而满足不了业务要求, 即然不能完足业务要求,也即得出的结果不是业务所需的,那么即便提高了效率,也是没意义的.
      

  4.   


    用动态SQL语句。declare @sql varchar(8000)set @sql = 'select * from 表名 where 1=1 'if @id is not null
       set @sql = @sql + ' and id = ' + cast(@id as varchar(10))if @name is not null
       set @sql = @sql + ' name = ''' + @name + ''''
      

  5.   

    craete proc [dbo].[sp_gbytest]
    @id  int,
    @name varchar(50),
    @age int,
    @address varchar(100) as
    declare @sql varchar(1000)
    begin set @sql='select * from t_student where 1=1 '
    set @sql = @sql + ' and id = ' + @id
    if @name is not null
    set @sql = @sql + ' and name=''' + @name + ''''
    if @age is not null
    set @sql = @sql + ' and age=' + @age
    if @address is not null
    set @sql = @sql + ' and address like ''%' + @address + '%'''
    print(@sql)
    exec (@Sql)end在执行的时候,只输入id的时候,报错:
    消息 245,级别 16,状态 1,过程 sp_gbytest,第 13 行
    在将 varchar 值 'select * from t_student where 1=1  and id = ' 转换成数据类型 int 时失败。
      

  6.   

    set @sql = @sql +  ' and id =  ' + @id -->改为set @sql = @sql +  ' and id =  ' + cast(@id  as varchar(100))
      

  7.   

    set @sql = @sql +  ' and age= ' + @age 
    -->
    set @sql = @sql +  ' and age= ' + cast(@age  as varchar(10))凡是数值型的变量,先转换为字符型,再连接到SQL串中。
      

  8.   

    wangtiecheng
    strsql是前台拼凑的,所以不回存在不附和业务需求的情况