有没有办法像这样在 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
不能在单个语句中select
和set
。
对于您的查询,您只需要分两部分执行此操作。首先设置变量值。第二个查询,用于获取表格式的结果记录。
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;