2017-08-30 115 views
0

如何插入到全局临时表中不固定列的动态t-sql查询的结果。 请参阅下面的表格定义,数值插入和针对数据透视查询的t-sql。将SQL Dynamic Pivot Query的结果集插入临时表中

/****** Object: Table [dbo].[ProdOrders] Script Date: 30/8/2017 7:24:35 PM ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[ProdOrders](
    [ItemCode] [nvarchar](50) NULL, 
    [ReleasedDate] [date] NULL, 
    [PlanQty] [float] NULL, 
    [ActualQty] [float] NULL 
) ON [PRIMARY] 

GO 

INSERT INTO [dbo].[ProdOrders] 
      ([ItemCode] 
      ,[ReleasedDate] 
      ,[PlanQty] 
      ,[ActualQty]) 
    VALUES 
    ('0D203-22882-079','2017-08-18',12654,4218), 
    ('0D203-22882-079','2017-08-23',15758,5253), 
    ('0D203-22882-079','2017-08-27',26263,8754), 
    ('0D203-22882-079','2017-09-02',7354,2451), 
    ('0D301-05422-079','2017-08-18',31144,10381), 
    ('0D301-05422-079','2017-08-18',20612,6871), 
    ('0D301-05422-079','2017-08-23',25765,8588), 
    ('0D301-05422-079','2017-08-29',19582,6527), 
    ('0D301-05422-079','2017-09-04',15459,5153), 
    ('0D203-22882-079','2017-09-22',5232,1744), 
    ('0D203-22882-079','2017-09-28',13236,4412), 
    ('0D203-22882-079','2017-10-03',7693,2564), 
    ('0D301-05422-079','2017-09-23',24735,8245), 
    ('0D301-05422-079','2017-09-27',19561,6520), 
    ('0D301-05422-079','2017-09-06',23755,7918), 
    ('0D301-05422-079','2017-09-14',23755,7918), 
    ('0D301-05422-079','2017-09-17',29694,9898), 
    ('0D203-22882-079','2017-11-01',2263,754), 
    ('0D203-22882-079','2017-10-21',15693,5231), 
    ('0D203-22882-079','2017-10-20',15968,5323), 
    ('0D203-22882-079','2017-10-25',10521,3507), 
    ('0D301-05422-079','2017-10-21',23755,7918), 
    ('0D301-05422-079','2017-10-29',17816,5939), 
    ('0D301-05422-079','2017-11-01',15612,5204), 
    ('0D301-05422-079','2017-10-03',20816,6939), 
    ('0D301-05422-079','2017-10-11',15612,5204), 
    ('0D301-05422-079','2017-10-18',26020,8673) 

Declare @SQL varchar(max) = ' 
Select * 
From (
     Select A.ItemCode 
       ,B.* 
     From [dbo].[ProdOrders] A 
     Cross Apply (values (convert(varchar(6),ReleasedDate,112)+''-Plan'',PlanQty) 
          ,(convert(varchar(6),ReleasedDate,112)+''-Actual'',ActualQty) 
        ) B (Item,Value) 
    ) S 
Pivot (sum([Value]) For [Item] in (' + Stuff((Select Distinct ','+QuoteName(convert(varchar(6),ReleasedDate,112)+'-Plan') 
                   +','+QuoteName(convert(varchar(6),ReleasedDate,112)+'-Actual') 
               From [dbo].[ProdOrders] 
               Order By 1 
               For XML Path('')),1,1,'') + ')) p' 
Exec(@SQL); 

我需要将结果集插入到全局临时表,以便我可以使用它来引用另一个查询。

+0

这里要非常小心......全局临时表表明您的解决方法有问题。他们充满了并发问题,并导致大多数人遇到很多问题。 –

回答

1

下面的脚本动态创建一个全局临时表。这个脚本没有检查表是否已经存在,你必须自己添加。 请谨慎使用全局临时表。我认为有更好的选择你想要什么。

--Script for creating global temp table 
    Declare @CreateTempTable [nvarchar](max) = ' 
    CREATE TABLE ##t ([ItemCode] nvarchar(50),' + 
    stuff((Select distinct ',' + QuoteName(convert(varchar(6), ReleasedDate,112)+'-Plan') + ' float,' + QuoteName(convert(varchar(6),ReleasedDate,112)+'-Actual') + ' float' 
    From [dbo].[ProdOrders] 
    Order By 1 For XML Path('')),1,1, '') + ')' 

    Exec sp_executesql @CreateTempTable 

    --Script for insert 
    Declare @InsertSql [nvarchar](max) = ' 
    INSERT INTO ##t ([ItemCode], ' + 
    stuff((Select distinct ','+QuoteName(convert(varchar(6), ReleasedDate,112)+'-Plan') + ', ' + QuoteName(convert(varchar(6),ReleasedDate,112)+'-Actual') + ' ' 
    From [dbo].[ProdOrders] 
    Order By 1 For XML Path('')),1,1, '') + ')' 

    Declare @SQL varchar(max) = @InsertSql + ' 
    Select * 
    From (
      Select A.ItemCode 
        ,B.* 
      From [dbo].[ProdOrders] A 
      Cross Apply (values (convert(varchar(6),ReleasedDate,112)+''-Plan'',PlanQty) 
           ,(convert(varchar(6),ReleasedDate,112)+''-Actual'',ActualQty) 
         ) B (Item,Value) 
     ) S 
    Pivot (sum([Value]) For [Item] in (' + Stuff((Select Distinct ','+QuoteName(convert(varchar(6),ReleasedDate,112)+'-Plan') 
                    +','+QuoteName(convert(varchar(6),ReleasedDate,112)+'-Actual') 
                From [dbo].[ProdOrders] 
                Order By 1 
                For XML Path('')),1,1,'') + ')) p' 
    Exec(@SQL); 

    Select * From ##t 
1

添加到子句中的SELECT语句,并尝试

Declare @SQL varchar(max) = ' 
Select * 
into ##globaltemptable 
From (...