【问题标题】:Inserting dynamic pivot Result into Temp table将动态数据透视结果插入临时表
【发布时间】:2019-12-22 22:31:02
【问题描述】:

我有下面的日期和脚本,可以按项目和年份计算销售额。它工作正常 但是当我尝试将结果插入临时表以便临时表可以在另一个查询中使用时。我有以下错误

CREATE TABLE #TBL  (Dates DATE, [Year] INT, Amt MONEY,Item Varchar(100))
INSERT INTO #TBL VALUES 
('2018-06-01',2018,34,'Milk'),('2018-07-01',2018,99,'Rice'),('2018-08-01',2018,77,'Rice'),('2018-09-01',2018,26,'Rice'),
('2018-10-01',2018,75,'Orange'),('2018-11-01',2018,94,'Grapes'),('2018-12-01',2018,80,'Grapes'),('2019-01-01',2019,9,'Grapes'),
('2019-02-01',2019,52,'Milk'),('2019-03-01',2019,28,'Orange'),('2019-04-01',2019,61,'Orange'),('2019-05-01',2019,51,'Milk');

DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME( Item) 
            FROM #TBL 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')
 SET @query = 
      'SELECT 
       * 
       INTO #Final
       FROM (
     SELECT [Year],Amt ,Item
    FROM #TBL ) FG
    PIVOT
    (
    SUM(Amt) FOR Item IN ('+@cols+')
    ) pv'
EXEC(@query)
select * from #Final
 ;DROP TABLE #TBL

错误无效的对象名称“#Final”。

是否可以将动态数据透视表中的数据插入到临时表中

【问题讨论】:

  • 我建议只在数据透视查询中使用select . . . into。最简单的方法是数据集中的全局临时表或真实表,而不是临时表。
  • 在动态语句中声明的临时表只会在该语句的持续时间内持续存在。如果您需要保留数据并将INSERT 保存到表中,您需要创建并定义一个永久 对象。考虑到您似乎没有在查询中进一步使用表 #Final,您为什么需要它?
  • @Larnu 我需要它,因为它是存储过程的一部分,我将使用它来加入存储过程中的其他表

标签: sql sql-server


【解决方案1】:

您可以使用双# 语法创建一个全局临时表:INTO ##Final,其范围将超出动态 sql

【讨论】:

    【解决方案2】:

    试试这个查询...

    如果存在,首先删除#Final ....

    然后创建#Final 表...

    然后 Perfrom 你的旧查询.....不会给出 error Invalid object name '#Final'。 这种类型的错误

    CREATE TABLE #TBL  (Dates DATE, [Year] INT, Amt MONEY,Item Varchar(100))
    INSERT INTO #TBL VALUES 
    ('2018-06-01',2018,34,'Milk'),('2018-07-01',2018,99,'Rice'),('2018-08-01',2018,77,'Rice'),('2018-09-01',2018,26,'Rice'),
    ('2018-10-01',2018,75,'Orange'),('2018-11-01',2018,94,'Grapes'),('2018-12-01',2018,80,'Grapes'),('2019-01-01',2019,9,'Grapes'),
    ('2019-02-01',2019,52,'Milk'),('2019-03-01',2019,28,'Orange'),('2019-04-01',2019,61,'Orange'),('2019-05-01',2019,51,'Milk');
    
    
    
    IF OBJECT_ID('tempdb..#Final', 'U') IS NOT NULL
    /*Then it exists*/
    DROP TABLE #Final
    
    
    CREATE TABLE #Final  ([Year] INT, Amt MONEY,Item Varchar(100))
    
    
    DECLARE @cols AS NVARCHAR(MAX),
            @query  AS NVARCHAR(MAX);
    
    SET @cols = STUFF((SELECT distinct ',' + QUOTENAME( Item) 
                FROM #TBL 
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
     SET @query = 
          'SELECT 
           * 
           INTO #Final
           FROM (
         SELECT [Year],Amt ,Item
        FROM #TBL ) FG
        PIVOT
        (
        SUM(Amt) FOR Item IN ('+@cols+')
        ) pv'
    EXEC(@query)
    select * from #Final
    
    DROP TABLE #TBL
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多