在SQL中声明变量时使用CTE

时间:2019-11-05 18:08:48

标签: sql common-table-expression

我有两个decrad变量,我试图根据CTE结果设置值

 declare @Total_new_claims_received int
 declare @Total_Claims_Processed int

我正在寻找的最终解决方案是能够从CTE结果中设置两个声明的值:

select @Total_new_claims_received = count(id) 
from cte 
where benefit_code_id not in ('739')



select @Total_Claims_Processed = count(id)
from cte2
where benefit_code_id  not in ('739')

当前代码:

 declare @Total_new_claims_received int
 declare @Total_Claims_Processed int

 with cte (ID, Date)
   as (

   select c.id, c.date
from axiscore.dbo.claim c with (nolock)
    inner join claim_line cl on c.Claim_ID = cl.Claim_ID and cl.Linenum = 1
    left join axiscore.dbo.member_policy mp with (nolock) on c.Member_Policy_ID = mp.Member_Policy_ID
    left join axiscore.dbo.policy p with (nolock) on mp.policy_id = p.policy_id
    inner join axiscore.dbo.Claim_Status s with (nolock) on c.Claim_Status_ID = s.Claim_Status_ID
    left outer join axiscore.dbo.Claim_Reason_Type r with (nolock) on c.Claim_Reason_Type_ID = r.Claim_Reason_Type_ID
where 
c.Updated_Date between '10-1-2019' and '10-31-2019'
and p.Payor_ID = 8
and (c.Claim_Status_ID <> 8)),



   cte2 (ID, Date)
   as 
   (
   select c.id, c.date
from axiscore.dbo.claim c with (nolock)
    inner join claim_line cl on c.Claim_ID = cl.Claim_ID and cl.Linenum = 1
    left join axiscore.dbo.member_policy mp with (nolock) on c.Member_Policy_ID = mp.Member_Policy_ID
    left join axiscore.dbo.policy p with (nolock) on mp.policy_id = p.policy_id
    inner join axiscore.dbo.Claim_Status s with (nolock) on c.Claim_Status_ID = s.Claim_Status_ID
    left outer join axiscore.dbo.Claim_Reason_Type r with (nolock) on c.Claim_Reason_Type_ID = r.Claim_Reason_Type_ID
where 
c.Updated_Date between '10-1-2019' and '10-31-2019'
and p.Payor_ID = 8
and (c.Claim_Status_ID in (7,6))                                                
and (c.Claim_Reason_Type_ID not in (136,137))) 




select @Total_new_claims_received = count(id)
from cte
where benefit_code_id  not in ('739')



select @Total_Claims_Processed = count(id)
from cte2
where benefit_code_id  not in ('739')

当前

仅设置Total_new_claims_received的值。当我设置Total_Claims_Processed的值时,它在第二个选择上出错。错误是“无效的对象名称'cte2'。

我使用CTE而不是临时表,因为我在SSIS包中将此过程称为。 SSIS包不适用于Temp表。任何其他想法也欢迎。

感谢您的光临!

1 个答案:

答案 0 :(得分:0)

来自WITH common_table_expression (Transact-SQL)

  

CTE后必须紧跟 SELECT,INSERT,UPDATE或   引用了部分或全部CTE列的DELETE语句

因此,在使用它的每个select语句之前定义每个CTE:

 declare @Total_new_claims_received int
 declare @Total_Claims_Processed int

with cte (ID, Date) as (
    select c.id, c.date
    from axiscore.dbo.claim c with (nolock)
    inner join claim_line cl on c.Claim_ID = cl.Claim_ID and cl.Linenum = 1
    left join axiscore.dbo.member_policy mp with (nolock) on c.Member_Policy_ID = mp.Member_Policy_ID
    left join axiscore.dbo.policy p with (nolock) on mp.policy_id = p.policy_id
    inner join axiscore.dbo.Claim_Status s with (nolock) on c.Claim_Status_ID = s.Claim_Status_ID
    left outer join axiscore.dbo.Claim_Reason_Type r with (nolock) on c.Claim_Reason_Type_ID = r.Claim_Reason_Type_ID
    where 
      c.Updated_Date between '10-1-2019' and '10-31-2019'
      and p.Payor_ID = 8
      and (c.Claim_Status_ID <> 8)
    )
select @Total_new_claims_received = count(id)
from cte
where benefit_code_id  not in ('739');

with cte2 (ID, Date) as (
    select c.id, c.date
    from axiscore.dbo.claim c with (nolock)
    inner join claim_line cl on c.Claim_ID = cl.Claim_ID and cl.Linenum = 1
    left join axiscore.dbo.member_policy mp with (nolock) on c.Member_Policy_ID = mp.Member_Policy_ID
    left join axiscore.dbo.policy p with (nolock) on mp.policy_id = p.policy_id
    inner join axiscore.dbo.Claim_Status s with (nolock) on c.Claim_Status_ID = s.Claim_Status_ID
    left outer join axiscore.dbo.Claim_Reason_Type r with (nolock) on c.Claim_Reason_Type_ID = r.Claim_Reason_Type_ID
    where 
      c.Updated_Date between '10-1-2019' and '10-31-2019'
      and p.Payor_ID = 8
      and (c.Claim_Status_ID in (7,6))                                                
      and (c.Claim_Reason_Type_ID not in (136,137))
) 
select @Total_Claims_Processed = count(id)
from cte2
where benefit_code_id  not in ('739');