2017-08-30 18 views
0

列が固定されていない動的t-SQLクエリの結果をグローバル一時テーブルに挿入する方法を教えてください。 テーブル定義、値の挿入、およびピボットクエリのt-sqlについては、以下を参照してください。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); 

私は私が別のクエリで参照するためにそれを使用できるように、グローバルな一時テーブルに結果セットを挿入する必要があります。

+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文のFROM句に追加して、以下のスクリプトが動的にグローバルな一時テーブルを作成し

Declare @SQL varchar(max) = ' 
Select * 
into ##globaltemptable 
From (... 
関連する問題