2013-07-11 3 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

Исправьте @ vs. #, но INCORRECT на tempdb, BOTH temp tables и table variables сохраняются в tempdb. Этот миф табличных переменных продолжается уже много лет, но это просто неверно. Google несколько авторитетных веб-сайтов, BOTH абсолютно пишет на диск. –

+1

Я никогда не говорил, что это было или не было ... –

+1

@TomStickel - больше нет, теперь вы можете создавать таблицы в памяти для лучшей производительности без записи на диск: https://docs.microsoft.com/en-us/ SQL/реляционные базы данных/в памяти-OLTP/быстрее темп-таблица и стол-переменный по-использовании-память-оптимизации. – Ian

5

Если вы хотите запросить результаты из временной таблицы внутри одного и того же запроса, вы можете использовать # temp tables или @ table variables (я лично предпочитаю @), для запроса вне области, которую вы хотели бы использовать ## глобальные временные таблицы или создать новую таблицу с результатами.

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 true, поскольку 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....... 
Смежные вопросы