我知道这个问题已被问过几次,但这些建议似乎对我不起作用。我有一个83行存储过程,我需要调用它并将开始和结束日期传递给它。如果我硬编码日期,这个程序很有用;但是,当我尝试将日期作为变量传递时,我收到错误:
从字符串
转换日期和/或时间时转换失败
我按如下方式调用我的存储过程:
exec dbo.CreateReport @startDate = '10/01/2013', @endDate = '12/31/2013'
我正在创建我的存储过程,如下所示:
create procedure dbo.CreateReport
@startDate smalldatetime = NULL,
@endDate smalldatetime = NULL
发生错误的代码块:
declare vp_laboraccount_timesheetitem_cursor cursor for
select a.laborleveldsc1,a.laborleveldsc2,a.laboracctid, sum(b.durationsecsqty)/3600 as totalhours
from vp_laboraccount a, timesheetitem b
where a.laboracctid=b.laboracctid and b.eventdtm >=''' + @@startDate + ''' and b.eventdtm <= ''' + @@endDate + ''' and employeeid = @personid
group by a.laborleveldsc1,a.laborleveldsc2,a.laboracctid
open vp_laboraccount_timesheetitem_cursor
fetch next from vp_laboraccount_timesheetitem_cursor into @laborleveldsc1,@laborleveldsc2,@laboracctid,@totalhours
while @@fetch_status=0
begin
--print results
select @message = @personid + ',' + @personcstmdatatxt + ',' + @searchfullnm + ',' + @prdohh + ',' + @prjob1 + ',' + @laborleveldsc1 + ',' + @laborleveldsc2 + ',' + @laboracctid + ',' + @totalhours + ',' + @companhiredtm
--print @message
insert into dbo.tabResults (messages) Values(@message)
fetch next from vp_laboraccount_timesheetitem_cursor into @laborleveldsc1,@laborleveldsc2,@laboracctid,@totalhours
end
close vp_laboraccount_timesheetitem_cursor
deallocate vp_laboraccount_timesheetitem_cursor
发生错误的具体行:
where a.laboracctid=b.laboracctid and b.eventdtm >=''' + @@startDate + ''' and b.eventdtm <= ''' + @@endDate + ''' and employeeid = @personid
有问题的两个变量是@@ startDate和@@ endDate。
我尝试了几件事,包括将变量作为varchar传递,以及对变量进行转换和强制转换,但似乎没有什么对我有用。我已经尝试了单个@和双@@符号因为那些经常给我带来问题。我尝试过不同的日期格式,但每次我得到相同错误消息的变体。如果我将日期字符串硬编码到代码中,它会按预期工作,并且没有错误。
我认为我非常迟钝,一旦有人用铁锹击中头部,解决方案就会很明显,但经过一周的尝试后,我准备寻求帮助了。
我做错了什么,我该怎么做才能解决这个问题?
谢谢。
答案 0 :(得分:2)
SQL Server中日期/时间文字的唯一真正安全格式,至少对于datetime
和smalldatetime
,是:YYYYMMDD
和YYYY-MM-DDThh:mm:ss[.nnn]
- {{3} }
为您的变量使用单个@
。
exec dbo.CreateReport @startDate='20131001', @endDate='20131231'
你的where
条款应该如此:
where a.laboracctid=b.laboracctid
and b.eventdtm >= @startDate
and b.eventdtm <= @endDate
and employeeid = @personid
此外,您应该使用正确的连接而不是旧式连接,并使用有意义的别名。