【发布时间】:2017-11-06 16:28:51
【问题描述】:
我知道这个问题已被问过几次,但这些建议似乎对我不起作用。我有一个 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 传递,以及对变量进行转换和强制转换,但似乎没有什么对我有用。我尝试了单@和双@@符号,因为它们经常给我带来问题。我尝试过不同的日期格式,但每次我收到相同错误消息的变体。如果我将日期字符串硬编码到代码中,它会按预期工作,并且不会出错。
我认为我非常迟钝,一旦有人用铁锹敲打我的头,解决方案就会很明显,但经过一周的各种尝试后,我准备寻求帮助。
我做错了什么,我该怎么做才能解决这个问题?
谢谢。
【问题讨论】:
-
删除引号。只需使用 eventdtm >= @startDate(@endDate 也是如此)。此处不使用动态 sql 时无需连接。你也只需要一个@。这是一个局部变量。
-
你也应该使用 ANSI-92 风格的连接,它们已经存在超过 25 年了。 sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/… 你应该使用有意义的别名来避免令人难以置信的痛苦。 sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/…
标签: sql sql-server tsql stored-procedures sql-server-2014