在WITH表达式(SQL Server)中声明变量?

时间:2011-03-09 08:38:30

标签: sql-server

有没有办法在WITH表达式中定义变量?类似的东西:

;WITH SomeName AS ( 
    declare @somevar decimal
    set @somevar = ...
    SELECT ....)

可能的?

3 个答案:

答案 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必须返回一个且只能返回一个记录。