2009-04-22 26 views
4

私はthisを見たので、動的に生成されたフィールドセットでピボットテーブルを作成する方法を知っています。私の問題は、結果を一時テーブルに入れたいということです。動的に生成されたピボットテーブルを一時テーブルにする

EXECステートメントから一時テーブルに結果セットを取得するには、一時テーブルを事前に定義する必要があることがわかります。動的に生成されたピボットテーブルの場合、あらかじめフィールドを知る方法はありません。

このタイプの機能を取得するには、動的SQLを使用して永続的なテーブルを作成するしかありません。より良い方法がありますか?

答えて

1

あなたがこれを行うことができます:

-- add 'loopback' linkedserver 
if exists (select * from master..sysservers where srvname = 'loopback') 
    exec sp_dropserver 'loopback' 
go 
exec sp_addlinkedserver @server = N'loopback', 
    @srvproduct = N'', 
    @provider = N'SQLOLEDB', 
    @datasrc = @@servername 
go 

declare @myDynamicSQL varchar(max) 
select @myDynamicSQL = 'exec sp_who' 
exec(' 
    select * into #t from openquery(loopback, ''' + @myDynamicSQL + '''); 
    select * from #t 
    ') 

EDITは:

+0

どのように動的SQLをOPENQUERYに渡しますか? – brian

+0

はありません。あなたもそれをダイナミックにしなければなりません。 –

+0

私は理解しています。明確にしてください – brian

1

は私が代わりに選択のこの説明をしてみましょうOPENQUERYするのparamsを受け入れるように動的SQLをaddded。私はSQL Server 2005も実行しています。あなたは、私は同じと仮定しようか、2008年

select 
    o.*, 
    OtherField1, 
    OtherField2 
INTO #temp 
FROM 
    OriginalOtherData as ood 
PIVOT (
    MAX([Value]) 
    FOR Field in (OtherField1, OtherField2) 
) as piv 
RIGHT OUTER join 
    Original o on o.OriginalSD = piv.OriginalSD 

select * from #temp 
Drop table #temp 

だピボットテーブルを持っているので、選択ノーマルとに選択の間唯一の違いは、それが#table部分にあります。クエリの

+0

リンク先の質問を読んでください。私はピボットテーブルのフィールドリストを生成するために動的SQLを使用しています。すでにテーブルが作成されていない限り、EXECでSELECT INTOを使用することはできません。私はEXECの結果のフィールドリストを知らないので、テーブルを事前に作成することはできません。 – brian

+0

すでにフィールドリストを動的に生成しています。だから、そのコードを使ってテーブル定義を生成するのはなぜですか? また、MSSQLがEXEC内でSELECT INTOを実行するのを妨げる何かがありますか? – Min

+0

これらの質問に対する答えは、動的SQLクエリ内で作成された一時テーブルのスコープが、EXEC呼び出しを行ったプロシージャ/クエリにアクセスできなくなることです。 – brian

0
  • (COL1が
  • COL2がcolumnheadersが
  • COL3がデータセット

  • もグローバルテーブル

    を取り除くされてなりrowlabelsなったtablename
  • からCOL1、COL2、COL3を選択
    if OBJECT_ID('tempdb..#3') is not null drop table #3 
    if OBJECT_ID('tempdb..##3') is not null drop table ##3 
    DECLARE @cols AS NVARCHAR(MAX), 
        @query AS NVARCHAR(MAX) 
    select @cols = STUFF((SELECT distinct ',' + QUOTENAME( col2 ) from tablename FOR XML PATH(''), col2).value('.', 'NVARCHAR(MAX)'),1,1,'') 
    set @query = 'SELECT col1, ' + @cols + ' into ##3 from (select col1, col2, col3 from tablename) x pivot ( max(col3)for col2 in (' + @cols + ')) p ' 
    execute(@query) 
    select * into #3 from ##3 if OBJECT_ID('tempdb..##3') -- is not null drop table ##3 
    
1

今日この問題に遭遇し、blogに投稿しました。ソリューションの簡単な説明は、1つの列を持つテンポラリ・テーブルを作成し、sp_executesqlを使用して動的に変更することです。次に、動的PIVOTの結果を挿入することができます。以下の作業例。

CREATE TABLE #Manufacturers 
(
    ManufacturerID INT PRIMARY KEY, 
    Name VARCHAR(128) 
) 

INSERT INTO #Manufacturers (ManufacturerID, Name) 
VALUES (1,'Dell') 
INSERT INTO #Manufacturers (ManufacturerID, Name) 
VALUES (2,'Lenovo') 
INSERT INTO #Manufacturers (ManufacturerID, Name) 
VALUES (3,'HP') 

CREATE TABLE #Years 
(YearID INT, Description VARCHAR(128)) 
GO 

INSERT INTO #Years (YearID, Description) VALUES (1, '2014') 
INSERT INTO #Years (YearID, Description) VALUES (2, '2015') 
GO 

CREATE TABLE #Sales 
(ManufacturerID INT, YearID INT,Revenue MONEY) 
GO 

INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(1,2,59000000000) 
INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(2,2,46000000000) 
INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(3,2,111500000000) 
INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(1,1,55000000000) 
INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(2,1,42000000000) 
INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(3,1,101500000000) 
GO 

DECLARE @SQL AS NVARCHAR(MAX) 
DECLARE @PivotColumnName AS NVARCHAR(MAX) 
DECLARE @TempTableColumnName AS NVARCHAR(MAX) 
DECLARE @AlterTempTable AS NVARCHAR(MAX) 

--get delimited column names for various SQL statements below 
SELECT 
    -- column names for pivot 
    @PivotColumnName= ISNULL(@PivotColumnName + N',',N'') + QUOTENAME(CONVERT(NVARCHAR(10),YearID)), 
    -- column names for insert into temp table 
    @TempTableColumnName = ISNULL(@TempTableColumnName + N',',N'') + QUOTENAME('Y' + CONVERT(NVARCHAR(10),YearID)), 
    -- column names for alteration of temp table 
    @AlterTempTable = ISNULL(@AlterTempTable + N',',N'') + QUOTENAME('Y' + CONVERT(NVARCHAR(10),YearID)) + ' MONEY' 
FROM (SELECT DISTINCT [YearID] FROM #Sales) AS Sales 

CREATE TABLE #Pivot 
(
    ManufacturerID INT 
) 

-- Thats it! Because the following step will flesh it out. 

SET @SQL = 'ALTER TABLE #Pivot ADD ' + @AlterTempTable 
EXEC sp_executesql @SQL 

--execute the dynamic PIVOT query into the temp table 
SET @SQL = N' 
    INSERT INTO #Pivot (ManufacturerID, ' + @TempTableColumnName + ') 
    SELECT ManufacturerID, ' + @PivotColumnName + ' 
    FROM #Sales S 
    PIVOT(SUM(Revenue) 
     FOR S.YearID IN (' + @PivotColumnName + ')) AS PivotTable' 
EXEC sp_executesql @SQL 

SELECT M.Name, P.* 
FROM #Manufacturers M 
INNER JOIN #Pivot P ON M.ManufacturerID = P.ManufacturerID 
+0

良いステップバイステップの完全なケーススタディ。あなたのブログのリンクはとにかく働いていません。 – vibs2006

+0

@ vibs2006 - 固定リンク、ありがとう – KnarfaLingus

関連する問題