存储过程的转义 困惑?? 求解

啃代码 2008-07-28 10:38:02
请问在页面传值后 存储,执行存储过程怎么不能查询到数据呢.我知道是"'"号的转义的问题.但是想了好多办法没解决掉,求助达人
谢谢!
@dtmStartTime nvarchar(20),
@dtmEndTime nvarchar(20),
@intUserType int
AS
declare @chvnSql NVARCHAR(1000)

set @chvnSql=N'SELECT id,Url,from,userName,userType FROM 表名 '


IF(LEN(@dtmStartTime)>0 and LEN(@dtmEndTime)>0 or @intUserType>0)
set @chvnSql=@chvnSql+' where id>0 '
--查询条件
IF(LEN(@dtmStartTime)>0 or LEN(@dtmEndTime)>0)
set @chvnSql=@chvnSql+ ' and [userVisitTime] between convert(datetime,'''+@dtmStartTime+''') and convert(datetime,'''+@dtmStartTime+''')'
IF(@intUserType>0)
set @chvnSql=@chvnSql+ ' and [userType] ='+STR(@intUserType)

EXECUTE sp_executesql @chvnSql


GO

sql 语句可以查询到:
SELECT * FROM pageVisits where [userVisitTime] between '2008-7-4' and '2008-7-28' and [userType] =3
...全文
169 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hery2002 2008-07-28
  • 打赏
  • 举报
回复
你先print出来看看你的语句究竟长什么样子啦!:)
@dtmStartTime nvarchar(20),
@dtmEndTime nvarchar(20),
@intUserType int
AS
declare @chvnSql NVARCHAR(1000)

set @chvnSql=N'SELECT id,Url,from,userName,userType FROM 表名 '


IF(LEN(@dtmStartTime)>0 and LEN(@dtmEndTime)>0 or @intUserType>0)
set @chvnSql=@chvnSql+' where id>0 '
--查询条件
IF(LEN(@dtmStartTime)>0 or LEN(@dtmEndTime)>0)
set @chvnSql=@chvnSql+ ' and [userVisitTime] between convert(datetime,'''+@dtmStartTime+''') and convert(datetime,'''+@dtmStartTime+''')'
IF(@intUserType>0)
set @chvnSql=@chvnSql+ ' and [userType] ='+STR(@intUserType)
print @chvnSql
-- EXECUTE sp_executesql @chvnSql
GO
啃代码 2008-07-28
  • 打赏
  • 举报
回复
在吃饭的高手 看一下,要不给一个你执行成功的类似存储过程例子给我 参考一下.好让我结贴给分啊 谢谢了 呵呵
啃代码 2008-07-28
  • 打赏
  • 举报
回复
什么都没提示,返回的,执行存储过程的时候查询不到任何东西,当然了字段名还是出现的
zoffor 2008-07-28
  • 打赏
  • 举报
回复
是不是提示datetime转换出错阿?
我原来碰到此问题,后面用sp_executesql带参数传入的方法才得以解决。
原因我认为是 datetime在拼字符串的时候转成了nvarchar类型,结果转不回来datetime型。
sdxiong 2008-07-28
  • 打赏
  • 举报
回复
把EXECUTE sp_executesql @chvnSql

改成Select @chvnSql

看看生成的SQL语句的内容就知道错在哪里啦
啃代码 2008-07-28
  • 打赏
  • 举报
回复
应该不是 where 的原因 ,继续求解答
hzs2006 2008-07-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hery2002 的回复:]
所以调试存储过程需要print出来看看,
[/Quote]经验之谈,学习!
hery2002 2008-07-28
  • 打赏
  • 举报
回复
首先写法有问题,
如果
IF(LEN(@dtmStartTime)>0 and LEN(@dtmEndTime)>0 or @intUserType>0)
set @chvnSql=@chvnSql+' where id>0 '

这个不满足的话,
那么你的语句可能就是这样的了,
SELECT id,Url,from,userName,userType FROM 表名  and [userVisitTime] between '2008-7-4' and '2008-7-28' and [userType] =3

这样肯定是有问题的,
建议把这部分
set  @chvnSql=N'SELECT id,Url,from,userName,userType FROM 表名 '       
IF(LEN(@dtmStartTime)>0 and LEN(@dtmEndTime)>0 or @intUserType>0)
set @chvnSql=@chvnSql+' where id>0 '

修改为
set  @chvnSql=N'SELECT id,Url,from,userName,userType FROM 表名 WHERE 1=1 ' -- 加上WHERE 1=1 

IF(LEN(@dtmStartTime)>0 and LEN(@dtmEndTime)>0 or @intUserType>0)
set @sqlWhere=@sqlWhere+' AND id>0 ' -- 去掉WHERE ,加上 AND

在试试
chuifengde 2008-07-28
  • 打赏
  • 举报
回复
1.确认时间格式一致
2.Str(@intUserType)==》Ltrim(Str(@intUserType))
hery2002 2008-07-28
  • 打赏
  • 举报
回复
所以调试存储过程需要print出来看看,
啃代码 2008-07-28
  • 打赏
  • 举报
回复
呵呵真 郁闷居然错在:
set @chvnSql=@chvnSql+ ' and [userVisitTime] between  convert(datetime,'''+@dtmStartTime+''')  and  convert(datetime,'''+@dtmStartTime+''')'

参数同名了 当然没数据了 都是开始时间 @dtmStartTime
给分了 哈哈
tianyusunkuangyu 2008-07-28
  • 打赏
  • 举报
回复
把你得表结构贴一下
适当的给出你的数据和你像要的数据
那样的话大家很快就可以给你解决了
utpcb 2008-07-28
  • 打赏
  • 举报
回复
哈你看看你写到有问题! 自己去改吧!我们已经告诉你方法了
utpcb 2008-07-28
  • 打赏
  • 举报
回复
你PRINT 一下!
print @chvnSql
declare @dtmStartTime nvarchar(20),
@dtmEndTime nvarchar(20),
@intUserType int
select @dtmStartTime=getdate(),@dtmEndTime=getdate(),@intUserType=1
declare @chvnSql NVARCHAR(1000)

set @chvnSql=N'SELECT id,Url,from,userName,userType FROM 表名 '


IF(LEN(@dtmStartTime)>0 and LEN(@dtmEndTime)>0 or @intUserType>0)
set @chvnSql=@chvnSql+' where id>0 '
--查询条件
IF(LEN(@dtmStartTime)>0 or LEN(@dtmEndTime)>0)
set @chvnSql=@chvnSql+ ' and [userVisitTime] between convert(datetime,'''+@dtmStartTime+''') and convert(datetime,'''+@dtmStartTime+''')'
IF(@intUserType>0)
set @chvnSql=@chvnSql+ ' and [userType] ='+STR(@intUserType)

print @chvnSql


GO



结果
SELECT id,Url,from,userName,userType FROM 表名 where id>0 and [userVisitTime] between convert(datetime,'07 28 2008 1:00PM') and convert(datetime,'07 28 2008 1:00PM') and [userType] = 1

上面是我print的 楼主测试一下啊自己修改

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧