2011-11-24 27 views
30

Tôi cần thay đổi một chế độ xem và tôi muốn giới thiệu 2 bảng tạm thời trước SELECT.Có thể tạo bảng tạm thời trong Chế độ xem và thả bảng sau khi chọn không?

Điều này có khả thi không? Và làm thế nào tôi có thể làm điều đó?

ALTER VIEW myView 
AS 

SELECT * 
INTO #temporary1 

SELECT * 
INTO #temporary2 

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

DROP TABLE #temporary1 
DROP TABLE #temporary2 

Khi tôi thử điều này, khiếu nại ALTER VIEW phải là câu lệnh duy nhất trong lô.

Tôi làm cách nào để đạt được điều này?

Cảm ơn

+4

Tại sao bạn không chỉ kết hợp các câu lệnh chọn vào mỗi câu trả lời dễ chịu? –

Trả lời

54

Không, một cái nhìn bao gồm một SELECT tuyên bố duy nhất. Bạn không thể tạo hoặc thả các bảng trong một khung nhìn.

Có thể common table expression (CTE) có thể giải quyết được sự cố của bạn. CTE là các tập kết quả tạm thời được xác định trong phạm vi thực thi của một câu lệnh duy nhất và chúng có thể được sử dụng trong các khung nhìn.

Ví dụ (lấy từ here) - bạn có thể nghĩ về SalesBySalesPerson CTE như một bảng tạm thời:

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

Bạn có thể đạt được những gì bạn đang cố gắng làm bằng Stored Procedure mà trả về một kết quả truy vấn. View s không phù hợp cho các hoạt động như thế này.

+3

Được cảnh báo: việc tạo một bảng tạm thời bên trong một thủ tục lưu trữ sẽ làm cho thủ tục đó được ** biên dịch lại ** (kể từ khi thay đổi lược đồ) và điền dữ liệu có thể gây ra ** biên dịch lại ** (kể từ khi số liệu thống kê thay đổi). Đây không phải là một cách tiếp cận rất tốt ..... –

+0

Câu trả lời của tôi là nếu bạn có thể sử dụng chế độ xem trong những trường hợp như vậy. Tôi không cố gắng đưa ra giải pháp tối ưu nhất ở đây. Câu trả lời của tôi áp dụng cho bất kỳ trường hợp nào có nhiều hơn một truy vấn SELECT. –

Các vấn đề liên quan