2011-11-24 3 views
30

하나의보기를 변경해야하며 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

왜 각 유혹에 들어가는 select-statements를 결합하지 않습니까? –

답변

54

아니, 뷰는 하나의 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 
0

당신은 쿼리 결과를 반환하는 Stored Procedure를 사용하여 무엇을하려고 achive 수 있습니다. View은 이와 같은 작업에 적합하지 않습니다.

+3

경고 : 저장 프로 시저 내부에 임시 테이블을 만들면 해당 프로 시저가 ** 다시 컴파일되므로 스키마가 변경되어 ** 데이터로 채우면 통계가 변경된 이후 ** 다시 컴파일 ** 될 수 있습니다. 이것은 아주 좋은 접근 방법이 아닙니다 ..... –

+0

내 대답은 그러한 경우에보기를 사용하는 것이 좋습니다. 여기서 가장 최적화 된 솔루션을 제공하려고하지 않습니다. 내 대답은 하나 이상의 SELECT 쿼리가있는 모든 사례에 적용됩니다. –

관련 문제