2014-05-08 82 views
0

SQL Server 2008存储过程不能删除它不存在的临时表

这是我最后一个问题的延续。现在我试图创建一个存储过程,但是我无法执行它。当我执行它时,显示错误消息 “无法删除表#MyReport”,因为它不存在或您没有权限。

请指导我在正确的方向。

下面是我的存储过程

Create PROCEDURE [dbo].[SEL_MyReport] 
(
    @employeeid int, 
    @date1 datetime, 
    @date2 datetime 
) 
AS 
BEGIN 
drop table #MyReport 
    Create Table #MyReport 
      ( 
       employeeid int, 
       name varchar(30), 
       department varchar(30), 
       checkTime datetime    
      )  

if (@employeeid > 0) 
    Begin 
     INSERT INTO #MyReport (employeeid,name, department, checkTime) 
      select emp.EmpolyeeID, emp.Name,dep.DeptName,tm.checkTime 
       from TimeInOut tm 
       left join Employee emp on emp.EmpolyeeId = tm.EmployeeId 
       left join Department dep on dep.DeptID = emp.defaultDeptID 
       where (DATEDIFF(s,@date1,tm.checktime) >=0 
       and DATEDIFF(s,@date2,tm.checktime)<=0) and emp.employeeID = @employeeid 

     SELECT 
       employeeid 
       ,name 
       ,department 
       ,[Time In] = MIN(checkTime) 
       ,[Time Out] = MAX(checkTime) 
     FROM #MyReport 
     GROUP BY employeeid,name, department, CAST(checktime AS DATE) 
    End 
Else 
    Begin 
     INSERT INTO #MyReport (employeeid,name, department, checkTime) 
      select emp.EmpolyeeID, emp.Name,dep.DeptName,tm.checkTime 
       from TimeInOut tm 
       left join Employee emp on emp.EmpolyeeId = tm.EmployeeId 
       left join Department dep on dep.DeptID = emp.defaultDeptID 
       where (DATEDIFF(s,@date1,tm.checktime) >=0 
       and DATEDIFF(s,@date2,tm.checktime)<=0) 
     SELECT 
       employeeid 
       ,name 
       ,department 
       ,[Time In] = MIN(checkTime) 
       ,[Time Out] = MAX(checkTime) 
     FROM #MyReport 
     GROUP BY employeeid,name, department, CAST(checktime AS DATE) 
    End 
END 
Go 

exec SEL_MyReport('639','05/01/2014','05/08/2014') 
+1

不应该有任何需要您的存储过程开始时为你放弃一个临时表。 –

+0

同意Damien - 事实上,我不确定你需要使用#table - “SELECT”应该足够吗? – MarkD

回答

0

有相当多的我会改变 - 这里是代码。

你会发现

  • 分支逻辑(如果@employeeid> 0)已被换成了稍微详细WHERE条款
  • 不需要#tables,据我所知道的,SELECT应该足够

不幸的是,我没有任何可以测试的地方,但是您应该了解它的一般印象。 此外,你的日期过滤似乎很奇怪,所以我认为你可能有其他意思 - 我可能会被误认为是。无论哪种方式,日期过滤现在做的方式是SARGable

CREATE PROCEDURE [dbo].[SEL_MyReport] 
(
    @employeeid INT, 
    @date1 DATETIME, 
    @date2 DATETIME 
) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT emp.EmpolyeeID 
      ,emp.Name 
      ,dep.DeptName 
      ,[Time In] = MIN(tm.checkTime) 
      ,[Time Out] = MAX(tm.checkTime) 
    FROM TimeInOut tm 
    LEFT 
    JOIN Employee emp on emp.EmpolyeeId = tm.EmployeeId 
    LEFT 
    JOIN Department dep on dep.DeptID = emp.defaultDeptID 
    WHERE tm.checktime >= @date1 
    AND tm.checktime <= @date2 
    /*********************************************************************************************************** 
    * I've assumed what you may be trying to express, above 
    * You might also want to look at the BETWEEN() operator, remembering that it is inclusive in its behaviour 
    * (DATEDIFF(s,@date1,tm.checktime) >=0 
    * AND DATEDIFF(s,@date2,tm.checktime)<=0) 
    ***********************************************************************************************************/ 
    AND (emp.employeeID = @employeeid OR @employeeid <= 0) 
    GROUP BY emp.EmpolyeeID, emp.name, dep.department, CAST(tm.checktime AS DATE) 

END 
GO 
0

好吧,既然你的存储过程的第一步尝试删除表,这显然会导致一个错误,如果该表不存在。

要解决此问题,请务必检查表是否存在,建议您删除它之前:

IF OBJECT_ID('tempdb..#MyReport') IS NOT NULL DROP 
    TABLE #MyReport 
+0

当我执行存储的proc时,我有一个问题:exec SEL_Attendance_Report(639,'2014-05-01 00:00:00.000',getdate())在我存储的proc下显示红色下划线,显示“不正确的语法还有getdate()有红色下划线显示不正确的语法 - – raul1996

+1

执行一个存储过程时,不要使用圆括号,因此请使用类似下面的代码:'exec SEL_Attendance_Report 639,'2014-05-01 00:00:00.000', GETDATE()' – Dan