这几天遇到一个问题,由于查询的判断条件太多,所以决定采用动态sql来解决。
存储过程传递的参数有时间类型的,
@sTime datetime, @eTime datetime
和sql语句连接的时候(set @mailSql=@mainSql + ... + @eTime )会出错,说字符串向时间类型转换失败。
于是把传递参数类型改为字符串类型的(因为语句内要比较的字段是时间类型,所以参数可以自动转换成时间类型的。),但是测试的时候还是查不到数据,经过分析发现执行时的时间实参变为没有单引号的值,类似于
2008-1-1 而不是 ‘2008-1-1’。所以无法查询到数据。
看来是需要单引号 ‘ ,到网上查些资料知道了可以用三个单引号来 代替 一个单引号,估计相当于编程语言里的 转意字符 /’,
set @mainSql = @mainSql + ' and convert(datetime, b.[SHouHuoShiJian]) < ''' + @eTime
但是后面还学要一个单引号啊,我试了用三个单引号不行,用四个竟然行了。可能是转意成两个单引号了吧。
set @mainSql = @mainSql + ' and convert(datetime, b.[SHouHuoShiJian]) < ''' + @eTime +''''
至此查询数据正确。
create proc GYLSearchSHDInfo
@sTime varchar(20),
@eTime varchar(20)
as
declare @mainSql varchar(1000)
set @mainSql=N' select a.ID,b.ID from a , b where a.BID=b.ID '
if(@sTime='1990-01-01')
begin
if(@eTime !='1990-01-01')
set @mainSql = @mainSql + ' and convert(datetime, b.[SHouHuoShiJian]) < ''' + @eTime +''''
end
else
begin
if(@eTime='1990-01-01')
set @mainSql = @mainSql + ' and convert(datetime, b.[SHouHuoShiJian]) > ''' + @sTime +''''
else
begin
set @mainSql = @mainSql + ' and convert(datetime, b.[SHouHuoShiJian]) > ''' + @sTime + ''''
set @mainSql = @mainSql + ' and convert(datetime, b.[SHouHuoShiJian]) < ''' + @eTime + ''''
end
end
exec(@mainSql)