有没有办法在WITH表达式中定义变量?类似的东西:
;WITH SomeName AS (
declare @somevar decimal
set @somevar = ...
SELECT ....)
可能的?
答案 0 :(得分:19)
不,你需要在CTE之外声明/设置它
DECLARE @somevar DECIMAL
;WITH SomeName AS (SELECT....)
SELECT @somevar = ...
FROM SomeName
每MSDN:
CTE_query_definition
指定一个 SELECT语句的结果集 填充公用表表达式。 SELECT语句 CTE_query_definition必须满足 与创建一个相同的要求 查看,除了CTE无法定义 另一个CTE。
答案 1 :(得分:0)
I've had to use the following approach a few times as a work-around (for example using R-Server in t-sql as the input_data_1 expression; see https://docs.microsoft.com/en-us/sql/advanced-analytics/tutorials/quickstart-r-inputs-and-outputs?view=sql-server-2017). The following illustrates the example:
WITH ctename (varname) as (
SELECT MAX(somevar) FROM sometable
)
SELECT *
FROM someothertable a
JOIN ctename b on 1=1
WHERE a.col1 > b.varname;
答案 2 :(得分:-2)
我知道现在这是一个老问题,但是可以使用CTE和CROSS JOIN的明智应用来近似“变量”行为,以利用基于集合的处理的力量。
WITH CTE_Name (somevar1, somevar2)
AS (SELECT 0.15, 0.65)
SELECT
sq.Col1 * cte.somevar1 AS Calc1,
sq.Col2 * cte.somevar2 AS Calc2
FROM (
SELECT 10 Col1, 20 Col2
UNION SELECT 30, 40
) AS sq
CROSS JOIN CTE_Name AS cte
请注意,使用CROSS JOIN会返回连接中涉及的表的笛卡尔积,因此为了避免最终输出中的过多/重复行,CTE必须返回一个且只能返回一个记录。