sql server 存储过程查询日期范围部分老出错

(@dateks varchar(20) , @datejs varchar(20) , @datelx varchar(20))
AS
declare @Sql varchar(1000)
set @Sql=' 1=1 '

if(@datelx='''1''')
set @Sql=@Sql+'and (CONVERT(varchar(100), qdrq, 23) between '+@dateks+' and '+@dateks
if(@datelx='''2''')
set @Sql=@Sql+' and (CONVERT(varchar(100), fhrq, 23) between '+@dateks+' and '+@dateks
if(@datelx='''3''')
set @Sql=@Sql+' and (CONVERT(varchar(100), sjshrq, 23) between '+@dateks+'and '+@dateks
set @Sql='select * from htxx where'+@Sql
exec(@Sql)

其中,@datelx 是用来判断日期类型的,有三种类型,分别是1、2、3 该语句在运行的时候老是会提示'2012-01-01' 附近有语法错误。

2012-01-01 是我的开始日期 不知道怎么办了~~望高手能够解答一下!
此查询中,还包含有其它条件的查询,我把语句精简了一下~~其它地方都没有问题了,就是在日期这块有问题。
if(@htbhcx<>'')
set @Sql=@Sql+' and htbh='+@htbhcx
if(@ywycx<>'')
set @Sql=@Sql+' and ywy='+@ywycx
if(@ywbmcx<>'')
set @Sql=@Sql+' and ywbm='+@ywbmcx
if(@kpqkcx='''1''')
set @Sql=@Sql+' and ykpje=0'
if(@kpqkcx='''2''')
set @Sql=@Sql+' and ykpje<htje'

--把日期的三个语句改成类似下面格式看看
set @Sql=@Sql+'and (CONVERT(varchar(100), qdrq, 23) between '+ char(39) + @dateks+ char(39) + ' and '+ char(39) + @dateks + char(39)追问

现在变 '2012' 附近有语法错误。

下面这个是我的执行语句
“DECLARE @return_value int
EXEC @return_value = [dbo].[search]
@dateks = N'''2012-01-01''',
@datejs = N'''2012-01-31''',
@datelx = N'''1'''
SELECT 'Return Value' = @return_value

GO”

追答

从你执行的SQL看, 你是在传参数的时候就把日期加上引号了, 改回你原来的样子吧
既然不是引号的问题, 你还是打出SQL看一下吧, 在exec(@Sql) 的前面加上这一句 print @sql
这样执行存储过程后你看一下消息里面应该有拼出来的SQL, 看看是哪里错了

追问

问题已经解决了,还想追问一下,在ASP里面如何实现 SQL Server 的存储过程 查询!
具体如果实现下面的这段语句~~
DECLARE @return_value int
EXEC @return_value = search,
@dateks = '2012-01-01',
@datejs = '2012-01-31',
@datelx = '1'
SELECT 'Return Value' = @return_value

非常非常感谢你的解答,我是一个初学者,有好多不太明白!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-29
这句改下 set @sql='select top '+str(@PPageSize)+' ID from ['+@PTable1+'] where( ID > ( select MAX(ID) from ( select top '+str((@PPage-1)*@PPageSize)+' ID from ['+@PTable1+'] )as a))' --======================================== 子查询的结果集加个别名就没问题了~
第2个回答  2012-03-29
你输出一下最后的sql语句就知道了,应该是日期没带单引号。