2011-11-24 21 views
30

Devo modificare una vista e voglio introdurre 2 tabelle temporanee prima di SELECT.È possibile creare una tabella temporanea in una vista e rilasciarla dopo selezionare?

È possibile? E come posso farlo?

ALTER VIEW myView 
AS 

SELECT * 
INTO #temporary1 

SELECT * 
INTO #temporary2 

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

DROP TABLE #temporary1 
DROP TABLE #temporary2 

Quando si tenta questo si lamenta che ALTER VIEW deve essere l'unica affermazione nel batch.

Come posso ottenere questo risultato?

Grazie

+4

Perché non basta unire le istruzioni selezionate ad ogni tentatore? –

risposta

54

No, la vista è costituito da un singolo SELECT dichiarazione. Non è possibile creare o eliminare tabelle in una vista.

Forse un common table expression (CTE) può risolvere il tuo problema. I CTE sono set di risultati temporanei definiti nell'ambito di esecuzione di una singola istruzione e possono essere utilizzati nelle viste.

Esempio (tratto da here) - si può pensare del SalesBySalesPerson CTE come una tabella temporanea:

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

È possibile achive ciò che si sta cercando di fare con un Stored Procedure che restituisce un risultato della query. View s non sono adatti per operazioni come questa.

+3

Attenzione: la creazione di una tabella temporanea all'interno di una stored procedure farà sì che tale procedura venga ** ricompilata ** (dato che lo schema cambia), e il riempimento con i dati potrebbe causare una ** ricompilazione ** ** (dato che le statistiche sono cambiate). Questo non è un buon approccio ..... –

+0

La mia risposta è se è ok usare le visualizzazioni in questi casi. Non sto cercando di dare la soluzione più ottimizzata qui. La mia risposta si applica a qualsiasi caso con più di una singola query SELECT. –

Problemi correlati