在sql server中的临时表中插入记录?

时间:2012-08-27 11:35:57

标签: sql sql-server sql-server-2008

在SQL Server中,我声明了一个表并尝试插入记录,但是插入时需要花费很多时间。这是我的临时表:

   declare @totalAprovals Table(
         apptype varchar(max)
       , Id varchar(max)
       , empno varchar(max)
       , empname varchar(max)
       , AppliedDate varchar(max)
       , rstatus varchar(max)
       , LeaveType varchar(max)
       , fromdate varchar(max)
       , todate varchar(max)
       , finyear varchar(max)
       , noofdays varchar(max)
       , perdate varchar(max)
       , pertype varchar(max) 
       , TotMin varchar(max)
       , FrmTime varchar(max)
       , ToTime varchar(max)
       , ConDate varchar(max)
       , Amount varchar(max)
       , MaterialDesc varchar(max)
       , EstValue varchar(max)
       , FromYear varchar(max)
       , ToYear varchar(max)
       , AvailedFrom varchar(max)
       , AvailedTo varchar(max)
       , Purpose  varchar(max)
       , FromPlace  varchar(max)
       , ToPlace  varchar(max)
       , ICode  varchar(max)
       , IDesc  varchar(max) 
       , MgrId varchar(max)    

和我的插入声明:

    insert into @totalAprovals          
     SELECT DISTINCT  'LEAVE' AppType
                    , CRS.applicationId ID
                    , CRS.EmpId EmpNo
                    , ISNULL((
                               SELECT FirstName 
                               FROM Tbl_Emp_M 
                               WHERE EmpId=CRS.EmpId
                               )
                               , CRS.EmpId) EmpName
                    , CONVERT(VARCHAR(10),LA.LeaveDate,103) AppliedDate
                    , (CASE ISNULL((
                                     SELECT top 1 CurStatus 
                                     FROM Tbl_CRS_Leave_AppHis_T 
                                     WHERE stepno=CRS.StepNo-1 
                                     and applicationId=CRS.applicationId  
                                     AND Status=1 
                                     order by StepNo desc),'0')   
                        WHEN '0' THEN 'Applied' 
                            WHEN '1' THEN 'Recommended' 
                            WHEN '2' THEN 'Approved' 
                       END) Rstatus
                    , LT.LeaveName LeaveType
                    , CONVERT(VARCHAR(10),LA.FromDate,103) FromDate
                    , CONVERT(VARCHAR(10),LA.ToDate,103) ToDate
                    , '' FinYear
                    , '' NoOfDays
                    , '' PerDate
                    , '' PerType
                    , '' TotMin
                    , '' FrmTime
                    , '' ToTime
                    , '' ConDate
                    , 0 Amount
                    , '' MaterialDesc
                    , 0 EstValue
                    , '' FromYear
                    , '' ToYear 
                    , ''AvailedFrom
                    , '' AvailedTo
                    , '' Purpose
                    , '' FromPlace
                    , '' ToPlace
                    , '' ICode
                    , '' IDesc
                    , CRS.MgrId    
    FROM   Tbl_Leave_App_T LA
         , Tbl_CRS_Leave_App_T CRS
         , Tbl_Leave_Typ_M LT
         , Tbl_Emp_ServiceDetails_T EMS   
    WHERE  CRS.applicationId = LA.ApplicationId 
    AND    LA.LeaveTypeId = LT.LeaveTypeId 
    and    crs.EmpId = ems.EmpId  
    AND    CRS.Status = 1 
    AND    LA.Status = 1 
    AND    LT.Status = 1 
    and    ems.Status = 1 
    AND    CRS.CurStatus IN ('0') 
    AND    YEAR(LA.LeaveDate) = YEAR(GETDATE()) 
    AND    la.LeaveTypeId not in (9,12) 
    AND  -- LA.ApplicationId LIKE '%LEV%' AND       
           CRS.EmpId = EMS.EmpId 
    and    ems.LocationCode  IN ('101','102','103','104','AHUP') 
    and    crs.MgrId ='xxxxx'

执行此操作需要2到3分钟。可能是什么原因?我写错了进程来插入记录吗?

2 个答案:

答案 0 :(得分:2)

您遇到了性能问题,因此请将其作为性能问题进行调查。使用Waits and Queues之类的方法。关注SQL Server PErformance Flowchart

当您在此处发布时,请始终添加用于创建这些表的完全 DDL,包括所有索引,并捕获并链接执行计划。

最有可能不是INSERT问题,而是SELECT。 DISTINCT始终是代码气味,表示对连接的理解不足。 WHERE子句充满了非可谓的谓词。

答案 1 :(得分:0)

我得到了解决方案,实际上我更换了声明表格 “声明@totalAprovals表”到“创建表#totalAprovals现在它的工作非常棒。感谢您回复所有。