Sql server 2008 使用多个返回布尔值的“with”语句创建SQL函数

Sql server 2008 使用多个返回布尔值的“with”语句创建SQL函数,sql-server-2008,tsql,Sql Server 2008,Tsql,我试图创建一个包含多个“With”语句的函数 我最初的问题是: WITH EmpCount as ( SELECT job.EmployeeID, assign.PropertyID FROM EmployeeJobstatus job JOIN Assignment assign ON job.JobID = assign.ID GROUP by job.EmployeeID, assign.PropertyID ), NoDup as (

我试图创建一个包含多个“With”语句的函数

我最初的问题是:

WITH EmpCount as 
  (
    SELECT job.EmployeeID, assign.PropertyID FROM EmployeeJobstatus job 
    JOIN Assignment assign ON job.JobID = assign.ID  GROUP by job.EmployeeID,
    assign.PropertyID
  ),
    NoDup as 
  (
    SELECT EmployeeID, Count(employeeID) as NO from EmpCount 
    Group by EmployeeID HAVING count(Employeeid) > 1
  )

    SELECT prop.Name, job.EmployeeID, Emp.EmpID, Emp.Name 
    from EmployeeJobStatus job
    JOIN Assignment assign ON assign.id = job.jobid
    JOIN Property prop ON prop.ID = assign.PropertyID
    JOIN Employee emp on emp.ID = job.EmployeeID
    WHERE EmployeeID IN (SELECT EmployeeID from NoDup)
    GROUP By prop.Name, EmployeeID, emp.EmpID,Emp.Name
    Order BY EmployeeID
这将返回:

Name           EmployeeID   EmpID         Name
Property 1      23         1286333      LastNameRemoved1, Rachel A
Property 2      23         1286333      LastNameRemoved1, Rachel A
Property 2      76         1268329      LastNameRemoved2, Tamer A
Property 1      76         1268329      LastNameRemoved2, Tamer A
Property 3      135        1411933      LastNameRemoved3, Sarah E
Property 1      135        1411933      LastNameRemoved2, Sarah E
我的函数需要使用EmployeeJobStatus StartDate和EndDate中的字段返回“Y”或“N”,具体取决于它们是否为跨属性

我只是开始我的功能,因为我不知道下一步该做什么

CREATE function dbo.IsEmployeeCrossPropertyOnDate
 (@EmpID int, @AsOfDate datetime) 
  RETURNS INT AS
任何帮助,或在正确的方向上轻推,都将不胜感激。多谢各位

这个怎么样

CREATE FUNCTION dbo.IsEmployeeCrossPropertyOnDate
    (
        @empid int
        , @asofdate datetime
    )
RETURNS TABLE
AS
RETURN
    SELECT
        CASE MIN(a.propertyid)
            WHEN MAX(a.propertyid)
                THEN 'N'
            ELSE 'Y'
        END CrossProp
    FROM 
        EmployeeJobStatus j
    JOIN 
        Assignment a
        ON a.id = j.jobid
    WHERE 
        j.employee = @empid
        AND j.startdate <= @AsOfDate
        AND j.endDate > @AsOfDate
    GROUP BY 
        j.employeeid;
编辑:

你可能会用它,而不是交叉。空值将是在该时间点没有任务的员工

编辑2:

既然你问了,下面是一个标量函数。小心标量。根据您在查询中使用它的位置,BEGIN-END块可以欺骗优化器进入RBAR

CREATE FUNCTION dbo.IsEmployeeCrossPropertyOnDate
    (
        @empid int
        , @asofdate datetime
    )
RETURNS CHAR(1)
AS
BEGIN
    DECLARE @res CHAR(1) = 'N';

    SELECT @res = 
        CASE MIN(a.propertyid)
            WHEN MAX(a.propertyid)
                THEN 'N'
            ELSE 'Y'
        END 
    FROM 
        EmployeeJobStatus j
    JOIN 
        Assignment a
        ON a.id = j.jobid
    WHERE 
        j.employee = @empid
        AND j.startdate <= @AsOfDate
        AND j.endDate > @AsOfDate
    GROUP BY 
        j.employeeid;

    RETURN @res;
END;

你能详细说明你的问题并给我们一些示例结果吗?如果能正确地定义cross,我们将不胜感激。cross property是指拥有相同EmployeeID和EmpID的员工,并且在多家酒店有工作分配。例如如果你在一家餐馆工作,比如说麦当劳。麦当劳是jobID1酒店,而几英里外的麦当劳jobid2酒店人手不足,所以你去帮助他们。然后,您将成为一名Crossproperty员工,因为您从事过两种不同的工作。对于提供的示例数据,NoDup表表达式似乎排除了只在一个属性上工作的任何人。这是故意的行为吗?是的。但是,它将显示员工在其第二家酒店不再活跃。我可以进一步缩小范围,这样就不会出现问题,但老板想要一个功能有没有办法不用表格就可以做到这一点?