2011-11-24 23 views
30

Necesito modificar una vista y quiero presentar 2 tablas temporales antes del SELECCIONAR.¿Es posible crear una tabla temporal en una vista y soltarla después de seleccionar?

¿Esto es posible? ¿Y cómo puedo hacerlo?

ALTER VIEW myView 
AS 

SELECT * 
INTO #temporary1 

SELECT * 
INTO #temporary2 

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

DROP TABLE #temporary1 
DROP TABLE #temporary2 

Cuando intento esto, se queja de que ALTER VIEW debe ser la única declaración en el lote.

¿Cómo puedo lograr esto?

Gracias

+4

¿Por qué no unes las declaraciones de selección que se incluyen en cada tentación? –

Respuesta

54

no, una vista consta de una sola SELECT comunicado. No puede crear o eliminar tablas en una vista.

Tal vez un common table expression (CTE) puede resolver su problema. Los CTE son conjuntos de resultados temporales que se definen dentro del alcance de ejecución de una declaración única y se pueden usar en vistas.

Ejemplo (tomado de here) - se puede pensar en el SalesBySalesPerson CTE como una tabla temporal:

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 
0

Usted puede achive lo que está tratando de hacer uso de un Stored Procedure que devuelve un resultado de la consulta. View s no son adecuados para operaciones como esta.

+3

Tenga cuidado: la creación de una tabla temporal dentro de un procedimiento almacenado provocará que ** recompile ** el procedimiento (ya que el esquema cambia), y llenarlo con datos podría causar ** una segunda recompilación ** (ya que las estadísticas cambiaron). Este no es un enfoque muy bueno ... –

+0

Mi respuesta es para si está bien usar vistas en tales casos. No estoy tratando de dar la solución más optimizada aquí. Mi respuesta se aplica a cualquier caso con más de una sola consulta SELECT. –

Cuestiones relacionadas