2011-11-24 6 views
30

Potrzebuję zmienić jeden widok i chcę wprowadzić 2 tymczasową tabelę przed SELECT.Czy można utworzyć tymczasową tabelę w widoku i upuścić po wybraniu?

Czy to możliwe? I jak mogę to zrobić?

ALTER VIEW myView 
AS 

SELECT * 
INTO #temporary1 

SELECT * 
INTO #temporary2 

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

DROP TABLE #temporary1 
DROP TABLE #temporary2 

Kiedy próbuję tego, narzeka, że ​​ALTER VIEW musi być jedynym stwierdzeniem w partii.

Jak mogę to osiągnąć?

Dzięki

+4

Dlaczego po prostu nie łączysz stwierdzeń wybranych, które pasują do każdego kuszącego? –

Odpowiedz

54

Nie, widok składa się z pojedynczego SELECT oświadczeniu. Nie można tworzyć ani upuszczać tabel w widoku.

Być może common table expression (CTE) może rozwiązać twój problem. CTE są tymczasowymi zestawami wyników, które są zdefiniowane w zakresie wykonywania pojedynczej instrukcji i mogą być używane w widokach.

Przykład (zaczerpnięte z here) - można myśleć o SalesBySalesPerson CTE jako tymczasowy tabeli:

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

Można achive co próbujesz zrobić używając Stored Procedure która zwraca wynik zapytania. View s nie nadają się do takich operacji.

+3

Uwaga: utworzenie tymczasowej tabeli wewnątrz procedury składowanej spowoduje, że procedura ta zostanie zrekompilowana ** (od czasu zmiany schematu), a jej wypełnienie danymi może spowodować ** ponowną kompilację ** (ponieważ statystyki uległy zmianie). To nie jest bardzo dobre podejście ..... –

+0

Moja odpowiedź brzmi, czy w takich przypadkach można używać widoków. Nie próbuję podać tutaj najbardziej zoptymalizowanego rozwiązania. Moja odpowiedź dotyczy każdego przypadku z więcej niż jednym zapytaniem SELECT. –

Powiązane problemy