日期:2014-05-17  浏览次数:20429 次

新手,请教sql中时间参数问题
表abc123中,字段A1是char格式的,字段A2是datetime格式的,删除A1为空和A2小于给定时间的,以下第一个执行成功,第二个执行不成功
declare @tablename varchar(50)
declare @sql varchar(200)
declare @stime datetime
set @time=''+CONVERT(varchar(100), GETDATE()-1, 23)+' 00:00:00'
set @tablename='abc123'
set @sql='delete from '+  '[dbo].['+rtrim(@tablename)+ ']'  +'where A1 is null'
execute (@sql)  
set @sql='delete from '+  '[dbo].['+rtrim(@tablename)+ ']'  +'where A2 <'+@time+''
exec(@sql)——执行不成功,报错:从字符串转换日期和/或时间时,转换失败。

把 '+@time+'直接换成@time,报错:A2附近有语法错误

请教,这个地方时间参数@time该怎么处理?

------最佳解决方案--------------------
试试:set @sql='delete from '+  '[dbo].['+rtrim(@tablename)+ ']'  +' where A2 <'''+convert(varchar(20),@time)+''''
------其他解决方案--------------------
引用:
引用:declare @time varchar(20)

定义成varchar行驶后,外面的单引号该怎么加呢?加上以后显示为字符串,不显示参数内容

set @sql='delete from '+  '[dbo].['+rtrim(@tablename)+ ']'  +'where A2 <'''+@time+''''
------其他解决方案--------------------
@sql在exec了一次之后就释放了,你要么换一个名字,要么重新赋值
------其他解决方案--------------------
declare @time varchar(20)
------其他解决方案--------------------
set @sql='delete from '+  '[dbo].['+rtrim(@tablename)+ ']'  +'where A2 <'+convert(varchar(20),@time)+''

------其他解决方案--------------------
引用:
set @sql='delete from '+  '[dbo].['+rtrim(@tablename)+ ']'  +'where A2 <'+convert(varchar(20),@time)+''


如果这样的话,会出现
delete from abc123 where A2 <2012-11-15 00:00:00,因为没有引号,所以运行也无法进行,如果在'+convert(varchar(20),@time)+'外再加引号,又不对,这个地方改怎么解决呢?谢谢~  
------其他解决方案--------------------
引用:
declare @time varchar(20)


定义成varchar行驶后,外面的单引号该怎么加呢?加上以后显示为字符串,不显示参数内容
------其他解决方案--------------------
引用:
试试:set @sql='delete from '+  '[dbo].['+rtrim(@tablename)+ ']'  +' where A2 <'''+convert(varchar(20),@time)+''''


这个好了,谢谢,之前总考虑到双引号,原来是多个单引号的,下次会注意~谢谢!
------其他解决方案--------------------
引用:
引用:引用:declare @time varchar(20)

定义成varchar行驶后,外面的单引号该怎么加呢?加上以后显示为字符串,不显示参数内容
set @sql='delete from '+  '[dbo].['+rtrim(@tablename)+ ']'  +'where A2 <''……


好了,谢谢!~