在 CTE(使用)中设置和定义变量,并在另一个 CTE 中使用它们



有没有办法像这样在 WITH 表达式中定义变量?

declare @Var1
declare @Var2;
With CTE as ( Select ...),
CTE2 as (select 
CTE.Something,
@Var1=(Select .. from CTE),
@Var1=(Select .. from CTE)
From CTE
)
Select * from CTE2

你的代码看起来像 T-SQL。

在 T-SQL 中,不能在同一选择语句中返回结果集和设置变量值,无论是否为 cte。

以下代码在 T-SQL 中无效:

declare @Var1 int;
select someColumn,
@var1 = someOtherColumn -- or a subquery or whatever
from someTable

如果select语句是公用表表达式的一部分,则它仍然无效。

此外,公用表表达式必须包含返回结果集的 select 语句 - 因此您不能执行以下操作:

with cte as
(
select @var1 = someColumn
from someTable
)

您无法在 CTE 中设置变量

如果您指定您的要求,我们可能会找到更好的解决方案

但是我的建议不是使用 CTE,而是使用临时表并从那里开始工作

declare @Var1
declare @Var2;
Select *
Into #TEMP
from MyTable
Select @var1 = col1,
@var2 = col2
from #TEMP
Select *, @var1, @var2
from #TEMP

不能在单个语句中selectset

对于您的查询,您只需要分两部分执行此操作。首先设置变量值。第二个查询,用于获取表格式的结果记录。

declare @var int
--- First statement
; with cte as
(select ...)
select @var = (select .. from cte) 
--- second statement
; with cte as
(select ...)
, ct as (
select id, (select .. from cte) from cte
)
select * from ct

尽管不需要在查询过程中设置变量值。

您可以获取变量中的值,也可以获取 select 语句中的数据。

不,你不能。WITH common_table_expression的 DOCS 说:

[ WITH <common_table_expression> [ ,...n ] ]  
<common_table_expression>::=  
expression_name [ ( column_name [ ,...n ] ) ]  
AS  
( CTE_query_definition )  

CTE_query_definition是(强调我的(:

指定其结果集填充公共 表表达式。CTE_query_definition必须的 SELECT 语句 满足与创建视图相同的要求,但 CTE 不能 定义另一个 CTE。有关详细信息,请参阅"备注"部分和 CREATE VIEW (Transact-SQL(。

在视图中,您无法设置变量,因此也无法在 CTE 中设置变量。

WITH CTE的官方文档在Microsoft SQL Docs上

WITH [CTE2] AS
(
SELECT dbo.yourFunction1(t.column_i) as var1
, dbo.yourFunction2(t.column_j) as var2
FROM dbo.[CTE] t
WHERE yourFunctionX(t.column_p) = 100
AND t.column_q IS NOT NULL 
);
declare @var1 varchar(500), @var2 varchar(500);
Select @var1 = t2.var1, @var2 = t2.var2 from [CTE2] t2;

最新更新