在SQL Server中从临时表创建临时视图

31

我有一个临时表,我想在这个临时表上创建一个临时视图。

这可行吗?

在下面的示例中,我想让#Top10Records成为一个视图而不是一个表,这样我就可以得到:

select * into #Top10Records from (select top 10 * from #MytempTable)
3个回答

58

你可以使用公共表达式来实现:

WITH Top10Records  AS 
( 
 select top 10 * from #MytempTable
) 
SELECT * FROM Top10Records 
GO

2
+1 这可能是最优雅的解决方法 - 很好的回答 - marc_s
19
当然,这仅适用于CTE之后只有一个语句的情况。我们不知道原帖作者是否打算在多个语句中使用临时视图。 - Damien_The_Unbeliever
3
它可以被多次使用,因为#MytempTable将会一直变化。 - Thunder
1
我的解决方法是每次删除并创建另一个#Top10Records临时表。 - Thunder
也许我在这里漏掉了什么,但是由于你只能调用一次Top10Records,所以与直接使用原始的select相比,这有什么更有用的地方呢?从#MytempTable中选择前10条记录。 - Ian Lee
1
@IanLee,你可以使用CTE(或多个链接的CTE)来分割你的代码,使其更清晰。你可能想要在一个或多个查询结果上进行复杂的查询,这些结果本身是由复杂的查询产生的。与将所有查询逻辑混合在一起不同,你可以将其拆分,以便更容易理解。 - Crono

12

很遗憾,SQL Server 不支持此操作:

Msg 4103,级别 15,状态 1,第 3 行:
"#someView": 不允许使用临时视图。
Msg 4508,级别 16,状态 1,第 6 行:
不能在临时表上使用视图或函数。以“#”开头的表名表示临时表。


0

SQL Server 不支持临时视图,正如Daryl所述,公共表达式(CTE)可能是正确的方法。然而,CTE 的一个限制是不能跨批处理使用。您可以创建一个标准视图,在需要时使用它,然后在批处理/事务结束时将其删除。(我知道 OP 的问题是是否可以创建临时视图,但这也可能适用 - 它需要架构更改,但对于所有实际目的来说是暂时的)。


这里有两个可能会引起麻烦的问题。一是(sql)用户需要db_owner权限才能执行此操作。二是,除非您在运行时组合sql(例如:使用sp_executesql),否则您将遇到名称冲突,并可能出现竞争条件问题,除非情况是单用户。这两个问题都不一定是致命的,但需要考虑。 - William

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