sql语句转换的一点问题 谢谢了

tanwei1002 2008-09-22 05:40:33
在存储过程中,有
CREATE proc test_getpage
declare @StartTime varchar(20),
.......
as
select * from keyevent where convert(datetime,starttime)>@StartTime
/*keyevent为表名,starttime为表中的一字段名*/
.......


后来由于程序需要,将这存储过程做了修改
CREATE proc test_getpage
declare @StartTime varchar(20),
.......
as
declare @sqlstr nvarchar(400)
set @sqlstr = 'select * from keyevent where'+' convert(datetime,starttime)>@StartTime '
....
上面加粗部分就是我想转换的,但是这样有语法错误。我想问下 @sqlstr应该怎么写,也就是说set @sqlstr = ?????

谢谢大家了
...全文
133 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
ok1234567 2008-09-25
  • 打赏
  • 举报
回复
注意 N''' and 的空格不能少
时间都表示为字符串形式当然没有问题的
tanwei1002 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 ok1234567 的回复:]
set @sqlstr = N'select * from keyevent where convert(datetime,starttime)> ''' + @StartTime + N''' and DestObject ='+@DestObject
[/Quote]

那如果查询时间段,就是查询在开始时间和结束时间之间的数据
可以这样写吗?
set @sqlstr = N'select * from keyevent where convert(datetime,starttime)> ''' + @StartTime + N''and convert(datetime,starttime)<''' + @EndTime+ N'''' and DestObject ='+@DestObject

这样说有语法错误。。。。
ok1234567 2008-09-25
  • 打赏
  • 举报
回复
问题是 @DestObject 必须是可以用字符串表示的东东
ok1234567 2008-09-25
  • 打赏
  • 举报
回复
set @sqlstr = N'select * from keyevent where convert(datetime,starttime)> ''' + @StartTime + N''' and DestObject ='+@DestObject
tanwei1002 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 tabby 的回复:]
晕。。怀疑你的测试方法,我在查询分析器当中运行,输入参数2008-01-01查询可以出现符合条件的记录。。
[/Quote]

发现问题了,郁闷死了,我定义@StartTime 的长度不够。现在下面这语句可以成功
set @sqlstr = N'select * from keyevent where convert(datetime,starttime)> ''' + @StartTime + N''''
那如果我再加个查询条件,比如我想加个目标对象,如下:

在存储过程中,有
CREATE proc test_getpage
declare @StartTime varchar(20),
declare @DestObject varchar(50),
.......
as
declare @sqlstr nvarchar(400)
set @sqlstr = N'select * from keyevent where convert(datetime,starttime)> ''' + @StartTime + N'''and DestObject =@DestObject ' --DestObject为表中的一个字段
这样不性 那set @sqlstr应该怎么写呢 谢谢
内存泄漏 2008-09-24
  • 打赏
  • 举报
回复
不知你那怎么回事,我执行了没有任何问题!
存储过程代码:
CREATE PROCEDURE test_p
@StartTime varchar(20)
AS
declare @sqlstr nvarchar(400)
--set @sqlstr = 'select * from test where convert(datetime,starttime)> ''2008/08/08'''
set @sqlstr = 'select * from test where convert(datetime,starttime)> ''' + @StartTime + ''''
exec (@sqlstr)
--exec sp_executesql @sqlstr
GO

建表语句:
CREATE TABLE [dbo].[test] (
[test_name] [varchar] (12) COLLATE Chinese_PRC_CI_AS NULL ,
[starttime] [datetime] NULL ,
[endtime] [datetime] NULL
)
内存泄漏 2008-09-24
  • 打赏
  • 举报
回复
从第一条开始是什么意思 ??
tanwei1002 2008-09-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 tabby 的回复:]
不知你那怎么回事,我执行了没有任何问题!
存储过程代码:
CREATE PROCEDURE test_p
@StartTime varchar(20)
AS
declare @sqlstr nvarchar(400)
--set @sqlstr = 'select * from test where convert(datetime,starttime)> ''2008/08/08'''
set @sqlstr = 'select * from test where convert(datetime,starttime)> ''' + @StartTime + ''''
exec (@sqlstr)
--exec sp_executesql @sqlstr
GO

建表语句:
CR…
[/Quote]

那我做法跟你没区别呀,怎么我查询起来总是从第一条开始呢?崩溃了
aility 2008-09-24
  • 打赏
  • 举报
回复
过来顶下,赚点分啊
tanwei1002 2008-09-24
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 tabby 的回复:]
晕。。怀疑你的测试方法,我在查询分析器当中运行,输入参数2008-01-01查询可以出现符合条件的记录。。
[/Quote]

我在查询分析器里面用具体日期数值也是可行的 但是在存储过程中用变量传进去的时候就有问题的
内存泄漏 2008-09-24
  • 打赏
  • 举报
回复
晕。。怀疑你的测试方法,我在查询分析器当中运行,输入参数2008-01-01查询可以出现符合条件的记录。。
tanwei1002 2008-09-24
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 tabby 的回复:]
从第一条开始是什么意思 ??
[/Quote]

是指能查询 但是查询的结果并不是从大于@StartTime开始的,而是从数据库表里面的第一条记录开始的。为什么会这样呢,现在这个'>@StartTime'查询条件根本就没起作用哦
这问题纠缠好几天了 还是没进展 头大了 哎

tanwei1002 2008-09-23
  • 打赏
  • 举报
回复
StartTime里面的值也没问题
调试了 也是查询出来的是第一条开始的记录
晕了,找不出是什么问题。
是不是因为@sqlstr是字符串,里面不能有单引号呀?今天听有人这样说。。。。。

内存泄漏 2008-09-23
  • 打赏
  • 举报
回复
是不是你StartTime 变量里面的值不对啊? 调试下看看..
ok1234567 2008-09-23
  • 打赏
  • 举报
回复
试试:
set @sqlstr = N'select * from keyevent where convert(datetime,starttime)> ''' + @StartTime + N''''
jiang5311 2008-09-23
  • 打赏
  • 举报
回复
应该是你存储过程中的变量@StartTime 的原因!!
你试着把这句:declare @StartTime varchar(20)改成declare @StartTime datetime
我以前也遇到过这种情况,SQL Server中按照字符比较和按照时间比较是不同的,这也是你代入真实时间没有问题的原因!
好了,下班了,希望你能够解决这个问题。
tanwei1002 2008-09-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tabby 的回复:]
是不是你StartTime 变量里面的值不对啊? 调试下看看..
[/Quote]


大哥 我也调试了,没发现什么问题。。。
tanwei1002 2008-09-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tabby 的回复:]
你用实际的日期试试:
set @sqlstr = 'select * from keyevent where convert(datetime,starttime)> ''2008/08/08'''
[/Quote]

具体日期可以查到
那这是什么问题呢?
内存泄漏 2008-09-22
  • 打赏
  • 举报
回复
你用实际的日期试试:
set @sqlstr = 'select * from keyevent where convert(datetime,starttime)> ''2008/08/08'''
tanwei1002 2008-09-22
  • 打赏
  • 举报
回复
set @sqlstr = 'select * from keyevent where convert(datetime,starttime)> ''' + @StartTime + ''''
select * from keyevent where convert(datetime,starttime)>@StartTime
上面查询的结果一样 都是从第一条开始的。我输入的时间条件根本就没起作用。
我觉得是不是这样 set @sqlstr = 'select * from keyevent where convert(datetime,starttime)> ''' + @StartTime + '''' 这语句中,@sqlstr 本来就是一个字符串,红色部分中单引号会不会被认为是select * from keyevent where convert(datetime,starttime)>的结束呢?

要不怎么查询还是从第一条开始呢?
加载更多回复(4)

4,012

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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