日期:2014-05-18 浏览次数:20495 次
ALTER PROCEDURE [dbo].[PRO_Priorflow_get] @strwhere varchar(500), ...... as begin select @total=count(1) from PRO_Priorflow where 1=1 + @strwhere .... end
ALTER PROCEDURE [dbo].[PRO_Priorflow_get] @strwhere varchar(500), @begintime varchar(500), @endtime varchar(500), @no int ...... as begin select @total=count(1) from PRO_Priorflow where 1=1 and time between @begintime and @endtime and NO=@no .... end
declare @total int, @sqls nvarchar(4000) set @sqls='select @a=count(*) from tableName where 1=1 and time between'+@begintime+'and'+@endtime+'and no='+@no exec sp_executesql @sqls,N'@a int output',@total output select @total
------解决方案--------------------
可以考虑使用动态SQL语句
先
@sql = '.....code......' exec( @sql )
------解决方案--------------------
declare @total int, @sqls nvarchar(4000) set @sqls='select @a=count(*) from tableName where 1=1 and time between'+@begintime+'and'+@endtime+'and no='+ltrim(@no) exec sp_executesql @sqls,N'@a int output',@total output select @total
------解决方案--------------------
你要选择动态拼接,没有传参数的条件就不要加。
------解决方案--------------------
应该是and recordtime between '2012-04-17 00:00:00' and '2012-04-20 23:59:59' ’
的问题
应该是' and recordtime between '''+'2012-04-17 00:00:00'+'''+' and '''+'2012-04-20 23:59:59'''
------解决方案--------------------
不要用拼串的方式,执行效率不好,而且如果微调一下,还得去改前端程序
这的需求有些像报表查询一样,根据条件来查询,如果没有选择哪个条件,where语句之后就不带它
很多人都根据选择的条件个数动态的去构建不同的SQL语句,前端程序会写的太复杂
每个成熟的业务系统都有一个统一的解决方案,可以用SQL探查器跟踪分析他们的查询行为看是怎么解决的