Sql Server - пользовательский CTE в подзапросе - PullRequest
7 голосов
/ 24 мая 2011

Этот вопрос задавался ранее -

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

Единственный предложенный ответ был "Просто определите свой CTE вtop и получить к нему доступ в подзапросе? "

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

  1. в качестве подзапросав SELECT

  2. в качестве производной таблицы в предложении FROM оператора SELECT

Обе они работают в PostgreSQL.В Sql Server 2005 я получаю «Неверный синтаксис рядом с ключевым словом« с »».

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

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

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

Ответы [ 2 ]

3 голосов
/ 24 мая 2011

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

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

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

1 голос
/ 24 июля 2011

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

Грустно, но верно !!!

С уважением, Капил

...