为什么条件不能正常工作?

时间:2016-08-18 07:50:24

标签: sql sql-server sql-server-2008 tsql

我有这个程序,它应该根据给出日期和其他一些输入返回记录。首先,它将branch_ID放在临时表@branches中,然后从临时表中选择该branch_ID,但它返回所有分支的记录,不仅仅是已经被挑选的分支。为什么?但是,当我把静态Branch_ID,即3,然后它选择它。

ALTER PROCEDURE [dbo].[usp_RejectedFiles] 
(  
 @FromDate SMALLDATETIME,  
 @ToDate SMALLDATETIME,  
 @OfficeID INT=0,  
 @Type INT=0
)  
AS  
BEGIN  

DECLARE @Branches TABLE  
(  
 BranchID INT  
)  

IF @Type = 1  
BEGIN  
 INSERT INTO @Branches SELECT BranchID From vw_OrganizationTree WHERE OrganizationID = @OfficeID  
END  

IF @Type = 2  
BEGIN  
 INSERT INTO @Branches SELECT BranchID From vw_OrganizationTree WHERE CompanyID = @OfficeID  

END  

IF @Type = 3  
BEGIN  
 INSERT INTO @Branches SELECT BranchID From vw_OrganizationTree WHERE BranchID = @OfficeID  
END  

    SELECT C.CompanyName,B.BranchName,E.EmployerName,FE.EmployeeUniqueID,pcr.EmployerUniqueID,
         FE.IncomeFixedComponent,FE.IncomeVariableComponent,  
         S.StatusDescription, FE.IsRejected, FE.ID 'EdrID'
    From File_EdrEntries FE JOIN PAFFiles pe ON pe.ID = FE.PAFFile_ID
    inner join File_PCREntries pcr on pe.ID=pcr.PAFFile_ID 
    JOIN Employers E ON E.EmployerID = pcr.EmployerUniqueID
    JOIN Branches B ON B.BranchID = E.Branch_ID JOIN companies C ON C.COMPANYID = B.COMPANY_ID  
    JOIN Statuses S ON S.StatusID = FE.Status_ID
    where fe.IsRejected=1 
    AND E.Branch_id = (Select Branch_ID from @Branches)

END

2 个答案:

答案 0 :(得分:1)

注意:请确认它不是拼写错误

@Branches表中列名称,列名称声明的问题与where子句中使用的不同。

@Branches表中的列名

DECLARE @Branches TABLE  
(  
 BranchID INT  
) 

在where子句中

...
AND E.Branch_id = (Select Branch_ID from @Branches)

@Branches表可能有多行,因此您应该使用IN的{​​{1}}而不是比较相等性

EXISTS

答案 1 :(得分:0)

您应该能够将所有内容组合成单个查询,而不是使用此临时表:

...
JOIN Statuses S ON S.StatusID = FE.Status_ID
where fe.IsRejected=1 
AND EXISTS (
   SELECT * FROM vw_OrganizationTree v
   WHERE v.BranchID = e.BranchID AND
     (@Type = 1 and v.OrganizationID = @OfficeID) or
     (@Type = 2 and v.CompanyID = @OfficeID) or
     (@Type = 3 and v.BranchID = @OfficeID)
   )

正如JaydipJ所暗示的那样,你当前代码无效的原因是因为:

AND E.Branch_id = (Select Branch_ID from @Branches)

Branch_ID表中没有名为@Branches的列。因此它成为对外部查询中的列的引用(如果有多个这样的列,则会生成错误)。它实际上已成为:

AND E.Branch_id = E.Branch_ID

这就是它返回所有行的原因。这就是为什么在使用子查询时使用带前缀的列名称总是一个好主意。这样:

AND E.Branch_id = (Select x.Branch_ID from @Branches x)

会产生关于不存在的列的错误,并给出了为什么它不起作用的线索。