Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用连接执行相交_Sql Server_Join_Intersection - Fatal编程技术网

Sql server 使用连接执行相交

Sql server 使用连接执行相交,sql-server,join,intersection,Sql Server,Join,Intersection,在以下存储过程中,我希望根据特定条件筛选员工。 员工将拥有一项主要技能和任意数量的次要技能 下面是技能表的模式 id => int EmpId => int TechnologyId => int isPrimarySkill => bit Proficiency => int 如何根据多个次要技能和主要技能获取员工, 它是空的 CREATE PROCEDURE [dbo].[USP_SearchEmployees] @Name varchar(40) = n

在以下存储过程中,我希望根据特定条件筛选员工。
员工将拥有一项主要技能和任意数量的次要技能 下面是技能表的模式

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
创建过程[dbo]。[USP\u]
@名称varchar(40)=空,
@ManagerId int=null,
@EmployeeType int=null,
@位置int=null,
@ExpInMonths int=null,
@PrimarySkills int=null,
@PrimarySkillsProficiency int=null,
@SecondarySkills XML=null,
@在int=null之后可用
像
声明@TSecondarySkills表(ID int)
开始
开始尝试
开始事务TransactionName
插入@TSecondarySkills(ID)
选择ParamValues.ID.value('.','VARCHAR(20)')
从@SecondarySkills.nodes('/tsecondarykills/id')作为参数值(id)
从员工E中选择E.Id作为EmpId,(E.FirstName+“”+E.LastName)作为EmpName
在ES.EmployeeId=E.Id上左键加入EmployeeSkill ES
在ES.TechnologyId=TSS.ID和ES.IsPrimarySkill=0上左键加入@TSecondarySkills-TSS
在RA.EmployeeId=E.Id和RA.EndDate>=GETDATE()和RA.StartDate=@ExpInMonths)上左键加入ResourceAllocation RA
(@SecondarySkills为空)或(TSS.ID不为空))以及

(@AvailableAfter为NULL,RA.EndDate为NULL)或(DATEDIFF(day,GETDATE(),RA.EndDate)如果您提到在StackOverflow中从学校粘贴的TagScope中使用的RDBMS可能会很有用。我在SQL Server中很弱。表中有哪些数据,您希望得到什么结果?