2013-07-11 15 views
10

Tôi có truy vấn này:SQL Server Tạo một bảng temp cho truy vấn này

DECLARE 
@ProjectID int = 3, 
@Year int = 2010, 
@MeterTypeID int = 1, 
@StartDate datetime, 
@EndDate datetime 

SET @StartDate = '07/01/' + CAST(@Year as VARCHAR) 
SET @EndDate = '06/30/' + CAST(@Year+1 as VARCHAR) 

SELECT tblMEP_Sites.Name AS SiteName, convert(varchar(10),BillingMonth ,101) AS BillingMonth, SUM(Consumption) AS Consumption 
FROM tblMEP_Projects 

JOIN tblMEP_Sites 
ON tblMEP_Projects.ID = tblMEP_Sites.ProjectID 

JOIN tblMEP_Meters 
ON tblMEP_Meters.SiteID = tblMEP_Sites.ID 

JOIN tblMEP_MonthlyData 
ON tblMEP_MonthlyData.MeterID = tblMEP_Meters.ID 

JOIN tblMEP_CustomerAccounts 
ON tblMEP_CustomerAccounts.ID = tblMEP_Meters.CustomerAccountID 

JOIN tblMEP_UtilityCompanies 
ON tblMEP_UtilityCompanies.ID = tblMEP_CustomerAccounts.UtilityCompanyID 

JOIN tblMEP_MeterTypes 
ON tblMEP_UtilityCompanies.UtilityTypeID = tblMEP_MeterTypes.ID 

WHERE tblMEP_Projects.ID = @ProjectID 
AND tblMEP_MonthlyData.BillingMonth Between @StartDate AND @EndDate 
AND tbLMEP_MeterTypes.ID = @MeterTypeID 
GROUP BY BillingMonth, tblMEP_Sites.Name 
ORDER BY month(BillingMonth) 

Tôi chỉ muốn lưu trữ nó trong một bảng tạm thời để tôi có thể làm điều gì đó với nó. Nó sẽ là tuyệt vời nếu bất cứ ai chỉ có thể bao gồm cú pháp để tạo ra một bảng tạm thời trong SQL Server.

Tôi đã thử nhiều cách khác nhau nhưng tôi đã mất và không nhận được kết quả mong muốn.

+0

thử SELECT INTO tuyên bố – maSTAShuFu

+0

đây là chèn tự động vào temptable mà không thực sự tạo ra cấu trúc bảng temp. lựa chọn của bạn. – maSTAShuFu

Trả lời

24

Nếu bạn muốn chỉ cần tạo một bảng tạm thời bên trong truy vấn mà sẽ cho phép bạn làm điều gì đó với kết quả mà bạn nạp vào nó, bạn có thể làm điều gì đó như sau:

DECLARE @T1 TABLE (
Item 1 VARCHAR(200) 
, Item 2 VARCHAR(200) 
, ... 
, Item n VARCHAR(500) 
) 

Trên đỉnh truy vấn của bạn và sau đó thực hiện một số

INSERT INTO @T1 
SELECT 
FROM 
(...) 
+0

Đúng trên @ so với #, nhưng KHÔNG TRẢ trên tempdb, BOTH bảng tạm thời và biến bảng được lưu trữ trong tempdb. Huyền thoại của các biến bảng này đã diễn ra trong nhiều năm, nhưng điều đó không đơn giản. Google một số trang web có uy tín, BOTH hoàn toàn viết vào đĩa. –

+1

Tôi chưa bao giờ nói nó đã làm hay không ... –

+1

@TomStickel - Không còn nữa, bạn có thể tạo các bảng trong bộ nhớ ngay bây giờ để có hiệu suất tốt hơn mà không cần ghi vào đĩa: https://docs.microsoft.com/en-us/ sql/relational-databases/trong bộ nhớ-oltp/nhanh hơn-temp-table-and-table-biến-by-sử dụng-bộ nhớ-tối ưu hóa. – Ian

5

Nếu bạn muốn truy vấn kết quả từ bảng tạm thời bên trong cùng một truy vấn, bạn có thể sử dụng # bảng tạm thời hoặc @ biến bảng (cá nhân tôi thích @), để truy vấn ngoài phạm vi bạn muốn sử dụng ## bảng tạm thời toàn cầu hoặc tạo một bảng mới với kết quả.

DECLARE 
@ProjectID int = 3, 
@Year int = 2010, 
@MeterTypeID int = 1, 
@StartDate datetime, 
@EndDate datetime 

SET @StartDate = '07/01/' + CAST(@Year as VARCHAR) 
SET @EndDate = '06/30/' + CAST(@Year+1 as VARCHAR) 

DECLARE @MyTempTable TABLE (SiteName varchar(50), BillingMonth varchar(10), Consumption float) 

INSERT INTO @MyTempTable (SiteName, BillingMonth, Consumption) 
SELECT tblMEP_Sites.Name AS SiteName, convert(varchar(10),BillingMonth ,101) AS BillingMonth, SUM(Consumption) AS Consumption 
FROM tblMEP_Projects 
+1

'@ MyTempTable' sẽ tạo biến, trong khi' # 'sẽ tạo bảng tạm thời trong' tempdb' – Paritosh

+0

@Paritosh đúng, vì OP không biết cú pháp của bảng tạm thời, tôi cho rằng câu hỏi có nghĩa là 'Tôi cần tạm thời lưu trữ kết quả trong cấu trúc bảng mà tôi có thể truy vấn '(trong trường hợp # hoặc @ sẽ hoạt động) –

4
DECLARE #MyTempTable TABLE (SiteName varchar(50), BillingMonth varchar(10), Consumption float) 

INSERT INTO #MyTempTable (SiteName, BillingMonth, Consumption) 
SELECT tblMEP_Sites.Name AS SiteName, convert(varchar(10),BillingMonth ,101) AS BillingMonth, SUM(Consumption) AS Consumption 
FROM tblMEP_Projects....... --your joining statements 

Ở đây, # - sử dụng để tạo bảng bên tempdb
@ - sử dụng để tạo ra bảng như biến.

9

Như thế này. Hãy chắc chắn rằng bạn thả bảng tạm thời (ở cuối khối mã, sau khi bạn đã hoàn thành nó) hoặc nó sẽ bị lỗi khi chạy tiếp theo.

SELECT 
    tblMEP_Sites.Name AS SiteName, 
    convert(varchar(10),BillingMonth ,101) AS BillingMonth, 
    SUM(Consumption) AS Consumption 
INTO 
    #MyTempTable 
FROM 
    tblMEP_Projects 
    JOIN tblMEP_Sites 
     ON tblMEP_Projects.ID = tblMEP_Sites.ProjectID 
    JOIN tblMEP_Meters 
     ON tblMEP_Meters.SiteID = tblMEP_Sites.ID 
    JOIN tblMEP_MonthlyData 
     ON tblMEP_MonthlyData.MeterID = tblMEP_Meters.ID 
    JOIN tblMEP_CustomerAccounts 
     ON tblMEP_CustomerAccounts.ID = tblMEP_Meters.CustomerAccountID 
    JOIN tblMEP_UtilityCompanies 
     ON tblMEP_UtilityCompanies.ID = tblMEP_CustomerAccounts.UtilityCompanyID 
    JOIN tblMEP_MeterTypes 
     ON tblMEP_UtilityCompanies.UtilityTypeID = tblMEP_MeterTypes.ID 
WHERE 
    tblMEP_Projects.ID = @ProjectID 
    AND tblMEP_MonthlyData.BillingMonth Between @StartDate AND @EndDate 
    AND tbLMEP_MeterTypes.ID = @MeterTypeID 
GROUP BY 
    BillingMonth, tblMEP_Sites.Name 

DROP TABLE #MyTempTable 
0
IF OBJECT_ID('tempdb..#MyTempTable') IS NOT NULL DROP TABLE #MyTempTable 

CREATE TABLE #MyTempTable (SiteName varchar(50), BillingMonth varchar(10), Consumption float) 

INSERT INTO #MyTempTable (SiteName, BillingMonth, Consumption) 
SELECT tblMEP_Sites.Name AS SiteName, convert(varchar(10),BillingMonth ,101) 
AS BillingMonth, SUM(Consumption) AS Consumption 
FROM tblMEP_Projects.......