2013-07-11 59 views
10

我有这个疑问:SQL Server中创建一个临时表,这个查询

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) 

我只是想将其存储在一个临时表中,这样我可以用它做什么。如果任何人都可以包含用于在SQL Server中创建临时表的语法,那将会很棒。

我尝试过不同的方式,但我迷路了,没有得到我想要的结果。

+0

尝试SELECT INTO语句 – maSTAShuFu

+0

这是自动插入到不是Temptable而不实际创建临时表结构。你的选择。 – maSTAShuFu

回答

24

如果你只想创建查询里面一个临时表,将允许你这样做的结果的东西,你存入它,你可以这样做以下:

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

在顶部您的查询,然后做一个

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

更正@对#,但对tempdb不正确,临时表和表变量都存储在tempdb中。这个表变量的神话已经持续了多年,但事实根本不是这样。谷歌几个有信誉的网站,都绝对写入磁盘。 –

+1

我从来没有说过它或没有... –

+1

@TomStickel - 现在不用了,现在可以创建内存表以获得更好的性能,而无需写入磁盘:https://docs.microsoft.com/en-us/ SQL /关系的数据库/存储器内-OLTP /更快-TEMP-表和表可变逐使用存储器优化。 – Ian

5

如果要查询来自同一查询中临时表的结果,可以使用#temp表或@table变量(我个人比较喜欢@)来查询您要使用的范围外部##全局临时表或使用结果创建一个新表。

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'会创建变量,'''会在'tempdb'中创建临时表 – Paritosh

+0

@Paritosh如果OP不知道临时表的语法,我认为这个问题意味着'我需要临时将结果存储在我可以查询的表结构中(在这种情况下,#或@将起作用) –

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 

这里,# - 用它来创建内部tempdb
@表 - 用它来创建表作为变量。

9

像这样。确保删除临时表(在代码块结束时,在完成之后),否则将在随后的运行中出错。

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....... 
相关问题