Sql Server - пользовательский CTE в подзапросе

этот вопрос был задан раньше -

как мы можем использовать CTE в подзапросе в sql server?

единственным ответом было: "просто определите свой CTE сверху и получите доступ к нему в подзапросе?"

это работает, но я бы очень хотел иметь возможность использовать CTE в следующих сценариях -

  1. Как подзапрос в SELECT

  2. как производная таблица в предложении FROM Выберите

оба они работают в PostgreSQL. С Sql Server 2005 я получаю "неправильный синтаксис рядом с ключевым словом "with"".

причина, по которой я хотел бы, заключается в том, что большинство моих запросов построены динамически, и я хотел бы иметь возможность определить CTE, сохранить его где-нибудь, а затем поместить его в более сложный запрос по требованию.

Если Sql Server просто не поддерживает это использование, мне придется принять его, но я не прочитал ничего, что заявляет, что это запрещено.

кто-нибудь знает, можно ли заставить это работать?

2 ответов


в SQL Server CTE должен находиться в верхней части запроса. Если вы строите запросы динамически, вы можете сохранить список CTE в дополнение к запросу. Перед отправкой запроса на SQL server можно задать префикс запроса со списком CTE:

; with Cte1 as (...definition 1...),
  Cte2 as (...definition 2...),
  Cte3 as (...definition 3...),
  ...
...constructed query...

это предполагает, что вы создаете SQL вне SQL Server.

вы также можете рассмотреть возможность создания представлений. Представления могут содержать CTE, и их можно использовать в качестве подзапроса или производной таблицы. Виды хороший выбор, если вы генерируете SQL нечасто, скажем, только во время установки или как часть развертывания.


SQL Server не поддерживает эту столь необходимую функцию. Я тоже искал помощи в этом. MS SQL Server не поддерживает временные представления в отличие от PostgreSQL. Вышеупомянутое решение также, вероятно, будет работать только в том случае, если все определения CTE могут быть сгенерированы ранее и не имеют конфликтующих имен в каждом из подзапросов-цель состоит в том, что эти определения CTE могут быть разными для каждого уровня подзапроса.

печально, но факт !!!

с уважением, Капил!--1-->