前一个贴子已经回你了.很简单.我假设,你存储过程的两个参数为 @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的参数做安全性检测
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,采用存储过程来处理
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 会有更多的扩充性.
执行的是 select * from t where id is null
而楼主的意图是当@p为null时
执行的是 select * from t --即不检索id=@p这个条件.与楼主意图根本冲突.
为了所谓的性能,而满足不了业务要求, 即然不能完足业务要求,也即得出的结果不是业务所需的,那么即便提高了效率,也是没意义的.
用动态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 + ''''
@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 时失败。
-->
set @sql = @sql + ' and age= ' + cast(@age as varchar(10))凡是数值型的变量,先转换为字符型,再连接到SQL串中。
strsql是前台拼凑的,所以不回存在不附和业务需求的情况