日期:2014-05-18 浏览次数:20610 次
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#实现的话, 建议,
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,....);
------解决方案--------------------
我倒建议使用邦定变量
strsql="select * from t where 1=1 and id=@p"
根据数据库执行SQL的原理,这个最适合在多客户端频繁查询同一数据表的情况,因为忙得时候DBMS会省去解析过程
------解决方案--------------------
我倒建议使用邦定变量
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这个条件.
与楼主意图根本冲突.
为了所谓的性能,而满足不了业务要求, 即然不能完足业务要求,也即得出的结果不是业务所需的,那么即便提高了效率,也是没意义的.
------解决方案--------------------
用动态SQL语句。 declare @sql varchar(8000) set @sql =
------解决方案--------------------
set @sql = @sql + ' and id = ' + @id
-->改为
set @sql = @sql + ' and id = ' + cast(@id as varchar(100))
------解决方案--------------------
set @sql = @sql + ' and age= ' + @age
-->
set @sql = @sql + ' and age= ' + cast(@age as varchar(10))