Sql Server - 在子查询中使用CTE的用户

8

这个问题之前已经被问过 -

如何在 SQL Server 的子查询中使用 CTE?

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

这样可以解决问题,但我真的希望能够在以下情况下使用 CTE -

  1. 作为 SELECT 中的子查询

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

这两种方法在 PostgreSQL 中都有效。但在 Sql Server 2005 中,我得到了“关键字 'with' 附近的语法不正确”。

我想要这个功能的原因是,我的大多数查询都是动态构建的,我希望能够定义一个 CTE,将其保存在某个地方,然后按需要将其放入更复杂的查询中。

如果 Sql Server 简单地不支持此用法,我将不得不接受它,但我没有读到任何说明它是不允许的。

是否有人知道如何使其工作?

2个回答

3

在SQL Server中,公用表表达式(CTE)必须置于查询的顶部。如果您动态构建查询,除了查询之外,您可以存储一个CTE列表。在将查询发送到SQL Server之前,您可以在查询前缀中添加CTE列表:

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

假设您是在SQL Server之外构建SQL,那么可以考虑创建视图。视图可以包含CTE,并且可以用作子查询或派生表。如果您很少生成SQL(例如仅在安装期间或作为部署的一部分),则视图是一个不错的选择。

1

SQL Server不支持这个非常必要的功能。我也一直在寻求帮助。 与PostgreSQL不同,MS SQL Server也不支持临时视图。上述解决方案只有在所有CTE定义都可以预先生成并且在每个子查询中没有冲突名称时才可能起作用-目的是这些CTE定义可能对于子查询的每个级别都不同。

可悲但却是事实!

敬礼, Kapil


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接