Объявление переменной в выражении WITH (SQL Server)?

Есть ли способ определить переменную внутри выражения WITH? Что-то вроде:

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

Возможные?

Ответ 1

Нет, вам нужно будет объявить/установить его вне CTE

DECLARE @somevar DECIMAL
;WITH SomeName AS (SELECT....)
SELECT @somevar = ...
FROM SomeName

Per MSDN:

CTE_query_definition
Определяет Оператор SELECT, набор результатов которого заполняет общее табличное выражение. Оператор SELECT для CTE_query_definition должно соответствовать те же требования, что и для создания view, за исключением того, что CTE не может определить другой CTE.

Ответ 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 должен вернуть одну и ТОЛЬКО одну запись.