从字符串

时间:2017-06-05 19:57:54

标签: sql sql-server tsql stored-procedures sql-server-2014

我知道这个问题已被问过几次,但这些建议似乎对我不起作用。我有一个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传递,以及对变量进行转换和强制转换,但似乎没有什么对我有用。我已经尝试了单个@和双@@符号因为那些经常给我带来问题。我尝试过不同的日期格式,但每次我得到相同错误消息的变体。如果我将日期字符串硬编码到代码中,它会按预期工作,并且没有错误。

我认为我非常迟钝,一旦有人用铁锹击中头部,解决方案就会很明显,但经过一周的尝试后,我准备寻求帮助了。

我做错了什么,我该怎么做才能解决这个问题?

谢谢。

1 个答案:

答案 0 :(得分:2)

SQL Server中日期/时间文字的唯一真正安全格式,至少对于datetimesmalldatetime,是:YYYYMMDDYYYY-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

此外,您应该使用正确的连接而不是旧式连接,并使用有意义的别名。