简体   繁体   English

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

[英]Inserting records in temporary table in sql server?

In SQL Server, I declare one table and trying to insert records, but it is taking so much time to insert. 在SQL Server中,我声明了一个表并尝试插入记录,但是它需要花费很多时间才能插入。 This is my temp table : 这是我的临时表:

   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)    

)

and my insert statement : 和我的插入声明:

    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'

It is taking 2 to 3 minutes to execute this. 执行此操作需要2到3分钟。 What could be the reason? 可能是什么原因? Am I writing wrong process to insert records? 我写错了进程来插入记录吗?

You have a performance problem so investigate it as a performance problem. 您遇到了性能问题,因此将其作为性能问题进行调查。 Use a methodology like Waits and Queues . 使用等待和队列等方法。 Follow the SQL Server PErformance Flowchart . 遵循SQL Server PErformance流程图

When you post here, always add the exact DDL used to create those tables, including all indexes, and capture and link the execution plans. 在此处发布时,请始终添加用于创建这些表的精确 DDL,包括所有索引,并捕获和链接执行计划。

Most likely is not the INSERT the problem, but the SELECT . 最有可能的不是INSERT问题,而是SELECT DISTINCT is always a code smell indicating a poorly understood join. DISTINCT始终是代码气味,表示对连接的理解不足。 The WHERE clause is full of non-sargable predicates. WHERE子句充满了非sargable谓词。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM