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