与连接执行交集

时间:2015-08-28 06:55:15

标签: sql-server join intersection

在以下存储过程中,我想根据特定条件过滤员工。
员工将拥有一项主要技能和任何数量的辅助技能 以下是技能表的架构。

id => int
EmpId => int 
TechnologyId => int
isPrimarySkill => bit
Proficiency => int

如何根据多种辅助技能和主要技能获取员工, 它给了空..

CREATE PROCEDURE [dbo].[USP_SearchEmployees]
 @Name varchar(40) = null,
 @ManagerId int = null,
 @EmployeeType int = null,
 @Location int = null,
 @ExpInMonths int = null,
 @PrimarySkills int = null,
 @PrimarySkillsProficiency int = null,
 @SecondarySkills XML = null,
 @AvailableAfter int = null
 AS

DECLARE @TSecondarySkills TABLE (ID int) 

BEGIN
    BEGIN TRY

        BEGIN TRANSACTION TransactionName

        INSERT INTO @TSecondarySkills (ID) 
        SELECT ParamValues.ID.value('.','VARCHAR(20)')
        FROM   @SecondarySkills.nodes('/TSecondarySkills/id') as ParamValues(ID)     


        SELECT E.Id as EmpId,(E.FirstName +' '+ E.LastName) as EmpName from Employee E
            LEFT JOIN EmployeeSkill ES ON ES.EmployeeId = E.Id
            LEFT JOIN @TSecondarySkills TSS ON ES.TechnologyId = TSS.ID AND ES.IsPrimarySkill = 0
            LEFT JOIN ResourceAllocation RA ON RA.EmployeeId = E.Id AND RA.EndDate >= GETDATE() AND RA.StartDate <= GETDATE()
        Where 
            ((@ManagerId IS NULL) OR (E.ManagerId = @ManagerId )) AND
            ((@Name IS NULL) OR (E.FirstName LIKE '%'+@Name+'%'  OR E.LastName LIKE '%'+@Name+'%' OR (E.FirstName+' '+E.LastName LIKE '%'+@Name+'%' ))) AND
            ((@EmployeeType IS NULL) OR (E.EmployementTypeId = @EmployeeType )) AND
            ((@Location IS NULL) OR (E.LocationId = @Location )) AND
            ((@PrimarySkills IS NULL) OR (ES.IsPrimarySkill = 1 AND TechnologyId = @PrimarySkills )) AND
            ((@PrimarySkillsProficiency IS NULL) OR (ES.IsPrimarySkill = 1 AND ES.Proficiency =  @PrimarySkillsProficiency )) AND
            ((@ExpInMonths IS NULL) OR (dbo.GetExpInMonthByEmpID(E.Id) >= @ExpInMonths)) AND
            ((@SecondarySkills IS NULL) OR (TSS.ID IS NOT NULL)) AND
            ((@AvailableAfter IS NULL AND RA.EndDate IS NULL) OR (DATEDIFF(day,GETDATE(),RA.EndDate) <= @AvailableAfter) OR (RA.EndDate IS NULL)) 

        GROUP BY 
            E.FirstName,E.LastName, E.Id


        COMMIT TRANSACTION TransactionName

  END TRY
  BEGIN CATCH
     RollBack Transaction TransactionName
  End Catch
END

0 个答案:

没有答案