在 SQL 中声明变量时使用 CTE

using CTE while declaring variables in SQL

我有两个 decraed 变量,我正在尝试根据我的 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 的值时,它在第二个 select 时出错。错误是“无效的对象名称 'cte2'.

我正在使用 CTE 而不是临时表,因为我在 SSIS 包中调用此过程。 SSIS 包不能很好地处理临时表。也欢迎任何其他想法。

感谢您的宝贵时间!

来自WITH common_table_expression (Transact-SQL)

A CTE must be followed by a single SELECT, INSERT, UPDATE, or DELETE statement that references some or all the CTE columns

因此,在使用它的每个 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');