【问题标题】:Work around temporary table in SQL Server 2008 view解决 SQL Server 2008 视图中的临时表问题
【发布时间】:2012-06-27 14:13:01
【问题描述】:

我用这种格式写了一个查询..

Select * INTO #xyz FROM ()

我以后想用它来创建一个视图,如...

CREATE VIEW aaa
AS 
   Select * INTO #xyz FROM ()

但出现以下错误:

  1. 关键字“INTO”附近的语法不正确。
  2. 临时表上不允许使用视图或函数

有人可以建议一个解决方法吗?是否可以使用临时表来创建视图?

【问题讨论】:

  • 你的最终目标是什么?你想用那个临时表做什么?
  • 你不能。视图是单语句活动。您可以使用“CTE”来帮助保持代码的可读性。

标签: sql-server-2008 view temp-tables


【解决方案1】:

您当然不能在视图中使用 select into。并且 termp 表也不合适。请改用与临时表等效的派生表。示例:

假设你有:

select t1.id, t2.field1 into #temp from table1 t1
join Table2 t2 on t1.id = t2.id
where t2.somefield2 = 'mytest'

select t1.id, t2.field1, t1.field1
from mytable2 t1
join #Temp t2 on t1.id = t2.id
where t2.somefield = 'test'

那么你可以使用:

select t1.id, t2.field1, t1.field1
from mytable2 t1
join (select t1.id, t2.field1 
        from table1 t1
        join Table2 t2 on t1.id = t2.id
        where t2.somefield2 = 'mytest') t2 
    on t1.id = t2.id
where t2.somefield = 'test'

你也可以使用 CTE

【讨论】:

  • 很高兴提到派生表。 SQL 是非常可组合的,这是一种乐趣。
  • 谢谢,我要试试这个。
【解决方案2】:

正如错误消息所说,不能使用临时表。

您应该使用也可以在视图中指定的永久表或 CTE。

CTE 可以根据您的情况为您提供帮助。如果您在研究什么是 CTE 后认为合适,请用一些上下文描述您的问题。简而言之,CTE 是一个可以多次引用的查询,过去人们使用临时表来进行查询。

http://msdn.microsoft.com/en-us/library/ms190766(v=sql.105).aspx

【讨论】: