0

我在 .net 中有以下查询及其超时,但在 sql server 中执行良好,.net 不像临时表或其他东西???我在 .net 中运行它,我得到一个超时错误,我完全不明白发生了什么。

     SET DATEFORMAT dmy
        declare @AbsenceReasonRestrictions varchar(500)
      set @AbsenceReasonRestrictions ='1'
      create table #absence
    ( 
        record_id INT,
        emp_no int,    
        staff_no varchar(max),
        emp_name varchar(max),
        details text,
        leave_reason int,
        leave_reason_desc varchar(30),
        current_status int,
        date_added datetime,
        dept int,
        dept_desc varchar(100),
        location int,
        location_desc varchar(100),
        division int,
        division_desc varchar(100),
        emptype int,
        emptype_desc varchar(100),
        contype int,
        contype_desc varchar(100),
        conclass int,
        conclass_desc varchar(100),
        line_manager int,
        line_manager_name varchar(510)
    )

        INSERT INTO #absence (record_id, 
            emp_no,    
            staff_no,
            emp_name,
            details,
            leave_reason,
            leave_reason_desc,
            current_status,
            date_added,
            dept,
            dept_desc,
            location,
            location_desc,
            division,
            division_desc,
            emptype,
            emptype_desc,
            contype,
            contype_desc,
            conclass,
            conclass_desc,
            line_manager,
            line_manager_name)

        select ua.record_id,
                ua.emp_no,
                e.staff_no,
                rtrim(e.surname)+', '+rtrim(e.forename1),
                ua.details,
                ua.absence_reason,
                ar.desc_,
                ua.current_status,
                ua.date_added,
                c.dept,
                rtrim(dept.desc_),
                c.location,
                rtrim(loc.desc_),
                c.division,
                rtrim(div.desc_),
                c.emptype,
                rtrim(emptype.desc_),
                c.type,
                rtrim(contype.desc_),
                c.classification,
                rtrim(conclass.desc_),
                ua.manager_user_id,
                (select rtrim(e.surname) + ', ' + rtrim(e.forename1) as emp_name from employee e 
                inner join userlist_mss um on e.emp_no = um.pams_id 
                where um.record_id = ua.manager_user_id)

            from ess_absence_requests ua
                inner join employee e on e.emp_no=ua.emp_no
                inner join absreas ar on ar.code=ua.absence_reason
                inner join contract c on ua.emp_no = c.emp_no
                join dept on c.dept=dept.code
                join location loc on c.location=loc.code
                join division div on c.division=div.code
                join emptype on c.emptype=emptype.code
                join contype on c.type=contype.code
                join conclass on c.classification=conclass.code
                where e.emp_no like '%'
                AND c.main_contract=1
                AND ua.current_status in (1,2,3,4)      
                AND (dbo.fn_XmlElementDateValue(ua.details, 'start_date') >='1/10/2013')
                AND (dbo.fn_XmlElementDateValue(ua.details, 'end_date') <='31/10/2013')
                AND e.active_leaver like 'ACTIVE'
                AND e.emp_no like '%'
                and c.dept like '%'
                and c.location like '%'
                and c.division like '%'
                and c.emptype like '%'
                and c.classification like '%'
                and c.type like '%'
                and ua.emp_no in (select employee_id from userlist_mss_employee_access_rights where manager_id=2)

                order by (dbo.fn_XmlElementDateValue(ua.details, 'start_date'))

             if @AbsenceReasonRestrictions!=''
        begin
            set @AbsenceReasonRestrictions=','+@AbsenceReasonRestrictions+','
            delete #absence where charindex(','+cast(leave_reason as varchar(10))+',', @AbsenceReasonRestrictions) = 0
        end

    select record_id,
        emp_no,    
        staff_no,
        emp_name,
        details,
        leave_reason,
        leave_reason_desc,
        current_status,
        date_added,
        dept_desc,
        location_desc,
        division_desc,
        emptype_desc,
        contype_desc,
        conclass_desc,
        line_manager,
        line_manager_name from #absence

    drop table #absence

    select * from emp_anal
4

2 回答 2

0

我想这是因为您的直接 sql 调用(使用管理工作室?)使用的查询计划与您的 .net 代码不同……而且 .net 使用的计划似乎不好……

要解决此问题,请尝试更新连接和dbcc freeproccache使用的表的表统计信息(更新统计信息)以清除缓存的查询计划...

于 2013-11-04T13:03:58.983 回答
0

我认为问题在于管理工作室对您的查询没有超时限制,但是当您在 .net 代码中运行它时,连接超时是有限的。尝试直接在连接字符串或连接初始化位置更改超时。

更多信息:

于 2013-11-04T14:01:29.460 回答