是否可以在视图中创建临时表并在选择后删除它?

时间:2011-11-24 11:43:54

标签: sql-server tsql

我需要改变一个视图,我想在SELECT之前引入2个临时表。

这可能吗?我怎么能这样做?

ALTER VIEW myView
AS 

SELECT *
INTO #temporary1

SELECT *
INTO #temporary2

SELECT * FROM #temporary1
UNION ALL 
SELECT * FROM #temporary1

DROP TABLE #temporary1
DROP TABLE #temporary2

当我尝试这个时,它会抱怨ALTER VIEW必须是批次中的唯一声明。

我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:72)

不,视图由单个SELECT语句组成。您无法在视图中创建或删除表。

也许common table expression(CTE)可以解决您的问题。 CTE是临时结果集,在单个语句的执行范围内定义,可以在视图中使用。

示例(摘自here) - 您可以将SalesBySalesPerson CTE视为临时表:

CREATE VIEW vSalesStaffQuickStats
AS
  WITH SalesBySalesPerson (SalesPersonID, NumberOfOrders, MostRecentOrderDate)
      AS
      (
            SELECT SalesPersonID, COUNT(*), MAX(OrderDate)
            FROM Sales.SalesOrderHeader
            GROUP BY SalesPersonID
      )
  SELECT E.EmployeeID,
         EmployeeOrders = OS.NumberOfOrders,
         EmployeeLastOrderDate = OS.MostRecentOrderDate,
         E.ManagerID,
         ManagerOrders = OM.NumberOfOrders,
         ManagerLastOrderDate = OM.MostRecentOrderDate
  FROM HumanResources.Employee AS E
  INNER JOIN SalesBySalesPerson AS OS ON E.EmployeeID = OS.SalesPersonID
  LEFT JOIN SalesBySalesPerson AS OM ON E.ManagerID = OM.SalesPersonID
GO

答案 1 :(得分:1)

您可以使用返回查询结果的Stored Procedure来实现您要执行的操作。 Views不适合/开发此类操作。

答案 2 :(得分:0)

不可能,但是如果您尝试CTE,则代码如下:

ALTER VIEW [dbo].[VW_PuntosDeControlDeExpediente]
AS
    WITH TEMP (RefLocal, IdPuntoControl, Descripcion) 
    AS 
    (
        SELECT 
              EX.RefLocal
            , PV.IdPuntoControl
            , PV.Descripcion
        FROM [dbo].[PuntosDeControl] AS PV
        INNER JOIN [dbo].[Vertidos] AS VR ON VR.IdVertido = PV.IdVertido
        INNER JOIN [dbo].[ExpedientesMF] AS MF ON MF.IdExpedienteMF = VR.IdExpedienteMF
        INNER JOIN [dbo].[Expedientes] AS EX ON EX.IdExpediente = MF.IdExpediente
    )
    SELECT 
          Q1.[RefLocal]
        ,    [IdPuntoControl] = ( SELECT MAX(IdPuntoControl) FROM TEMP WHERE [RefLocal] = Q1.[RefLocal] AND [Descripcion] = Q1.[Descripcion] )
        , Q1.[Descripcion]
    FROM TEMP AS Q1
    GROUP BY Q1.[RefLocal], Q1.[Descripcion]
GO

答案 3 :(得分:0)

尝试创建另一个SQL视图而不是临时表,然后在主SQL视图中引用它。换句话说,视图内的一个视图。完成创建主视图后,您可以放下第一个视图。