【问题标题】:SQL Server Creating a temp table for this querySQL Server 为此查询创建临时表
【发布时间】:2013-07-10 03:13:34
【问题描述】:

我有这个问题:

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 中创建临时表的语法,那就太好了。

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

【问题讨论】:

  • 试试 SELECT INTO 语句
  • 这是自动插入临时表而不实际创建临时表结构。你的选择。

标签: sql sql-server temp-tables


【解决方案1】:

如果要在检查存在表后创建临时表。可以使用以下代码

DROP TABLE IF EXISTS tempdb.dbo.#temptable
CREATE TABLE #temptable
  (
   SiteName             NVARCHAR(50),
   BillingMonth         varchar(10),
   Consumption          INT,
  )

创建临时表后,可以将数据作为普通表插入到该表中:

INSERT INTO #temptable
SELECT COLUMN1,...
FROM
(...)

INSERT INTO #temptable
VALUES (value1, value2, value3, ...);

SELECT 语句用于从临时表中选择数据。

SELECT * FROM #temptable

您可以使用 DROP TABLE 语句手动删除临时表:

DROP TABLE #temptable;

【讨论】:

    【解决方案2】:

    如果您只想在查询中创建一个临时表,允许您对存入其中的结果执行某些操作,您可以执行以下操作:

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

    在查询的顶部,然后执行

    INSERT INTO @T1
    SELECT
    FROM
    (...)
    

    【讨论】:

    • 在 @ 与 # 上正确,但在 tempdb 上不正确,临时表和表变量都存储在 tempdb 中。这个关于表变量的神话已经持续了很多年,但它根本不是真的。谷歌几个有信誉的网站,都绝对写入磁盘。
    • @TomStickel - 现在不用了,您现在可以创建内存表以获得更好的性能,而无需写入磁盘:docs.microsoft.com/en-us/sql/relational-databases/…
    【解决方案3】:
    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.......
    

    【讨论】:

      【解决方案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 中创建表
      @ - 使用它来创建表作为变量。

      【讨论】:

      • SQL 报告语法错误DECLARE #MyTempTable TABLE ...
      【解决方案5】:

      如果你想在同一个查询中从临时表中查询结果,你可以使用#临时表,或者@表变量(我个人更喜欢@),在你想要使用的范围之外进行查询# # 全局临时表或使用结果创建一个新表。

      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
      

      【讨论】:

      • @MyTempTable 将创建变量,而# 将在tempdb 中创建临时表
      • @Paritosh true,鉴于 OP 不知道临时表的语法,我认为问题的意思是“我需要将结果临时存储在我可以查询的表结构中”(在这种情况下 # 或 @ 将起作用)
      【解决方案6】:

      像这样。确保删除临时表(在代码块的末尾,完成后),否则在后续运行时会出错。

      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
      

      【讨论】:

        猜你喜欢
        • 2013-07-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-15
        • 2014-03-23
        • 1970-01-01
        • 2011-11-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多