Sql server 将SQL动态透视查询的结果集插入临时表

Sql server 将SQL动态透视查询的结果集插入临时表,sql-server,global-temp-tables,Sql Server,Global Temp Tables,如何将列不固定的动态t-sql查询的结果插入到全局临时表中。 有关表定义、值插入和pivot查询的t-sql,请参见下文 /****** 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] [nv

如何将列不固定的动态t-sql查询的结果插入到全局临时表中。 有关表定义、值插入和pivot查询的t-sql,请参见下文

/****** 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);

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

请在select语句中添加into子句,然后重试

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

在select语句中添加into子句,然后重试

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

下面的脚本动态创建一个全局临时表。此脚本没有检查表allready是否存在,您必须自己添加该表。 小心使用全局临时表。我认为除了你想要的,还有更好的选择

    --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

下面的脚本动态创建一个全局临时表。此脚本没有检查表allready是否存在,您必须自己添加该表。 小心使用全局临时表。我认为除了你想要的,还有更好的选择

    --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

这里要非常小心…全局临时表表明您解决问题的方法有问题。它们充满了并发性问题,给大多数人带来了很多问题。在这里要非常小心…全局临时表表明您解决问题的方法有问题。它们充满了并发性问题,给大多数人带来了很多问题。