Sql Server - 子查询中的用户CTE

Fra*_*man 7 sql-server subquery common-table-expression

之前已经问过这个问题 -

我们如何在sql server中的子查询中使用CTE?

建议的唯一答案是"只需在顶部定义您的CTE并在子查询中访问它?"

这有效,但我真的希望能够在以下场景中使用CTE -

  1. 作为SELECT中的子查询

  2. 作为SELECT的FROM子句中的派生表

这两个都在PostgreSQL中工作.使用Sql Server 2005,我得到"关键字'附近的语法不正确'和'".

我希望它的原因是我的大多数查询都是动态构造的,我希望能够定义一个CTE,将其保存在某个地方,然后根据需要将其放入更复杂的查询中.

如果Sql Server根本不支持这种用法,我将不得不接受它,但我没有读过任何声明它不被允许的内容.

有谁知道是否可以让这个工作?

And*_*mar 3

在 SQL Server 中,CTE 必须位于查询的顶部。如果动态构建查询,除了查询之外,还可以存储 CTE 列表。在将查询发送到 SQL Server 之前,您可以在查询前添加 CTE 列表作为前缀:

; with Cte1 as (...definition 1...),
  Cte2 as (...definition 2...),
  Cte3 as (...definition 3...),
  ...
...constructed query...
Run Code Online (Sandbox Code Playgroud)

这是假设您在 SQL Server 外部构建 SQL。

您还可以考虑创建视图。视图可以包含 CTE,并且它们可以用作子查询或派生表。如果您不经常生成 SQL(例如仅在安装期间或作为部署的一部分),那么视图是一个不错的选择。