2017-05-10 5 views
0

次のコードを実行してデータセットをトランスポーズすると、テンポラリテーブルに出力を保存したいので、スクリプトの外で 'select * from #table'のようなコードを実行できます。結果を確認してください。どんな助けもありがとう。動的SQLのテンポラリテーブルへの出力

データ:

TimeSeconds TagID Value 
1378700244 A1 3.75 
1378700245 A1 30 
1378700304 A1 1.2 
1378700305 A2 56 
1378700344 A2 11 
1378700345 A3 0.53 
1378700364 A1 4 
1378700365 A1 14.5 
1378700384 A1 144 
1378700384 A4 10 

コード:

DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX) 

SET @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(TagID) 
      FROM Table1 
      ORDER BY 1 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)'),1,1,'') 

SET @sql = 'SELECT TimeSeconds, ' + @cols + ' 
       FROM 
      (
       SELECT TimeSeconds, TagID, Value 
       FROM table1 
      ) s 
      PIVOT 
      (
       MAX(Value) FOR TagID IN (' + @cols + ') 
      ) p' 

EXECUTE(@sql) 
+0

構文に基づいてSql-Serverタグを追加しました。編集して、バージョン固有のタグも追加してください。 –

+0

また、列リストがあらかじめわからないため、問題が発生する可能性があります。 –

答えて

0

まあ、それはあなたが事前に列の数を知らないので、問題があります。
これは、create tableで一時テーブルを定義できないことを意味します。
私は非常に醜い回避策を思いついた、おそらく他の人がよりエレガントな方法でそれを行うことができるでしょう。
私の考えは、select...intoを使用して動的SQLスクリプトでグローバル一時テーブルを作成し、別のselect intoを使用して、そのテーブルからローカル一時テーブルを作成し、グローバルテーブルを削除することです。もし複数のユーザーが同時にこのスクリプトを実行する可能性がある場合、それが原因での使用のため、本当に良いアイデアではないことを

DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX) 

SET @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(TagID) 
      FROM Table1 
      ORDER BY 1 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)'),1,1,'') 

-- Note I'va added ' INTO ##TEMP' 
SET @sql = 'SELECT TimeSeconds, ' + @cols + ' INTO ##TEMP 
       FROM 
      (
       SELECT TimeSeconds, TagID, Value 
       FROM table1 
      ) s 
      PIVOT 
      (
       MAX(Value) FOR TagID IN (' + @cols + ') 
      ) p' 

EXECUTE(@sql) 


-- Create the local temporary table from the data in the global one 
SELECT * INTO #Temp 
FROM ##TEMP 
-- Drop the global temporary table 
DROP TABLE ##TEMP 

注意(グローバルテーブルで満足している場合はもちろん、このステップは冗長です)グローバル一時表

+0

ありがとうございますこれは正常に動作します –

0
IF OBJECT_ID('Tempdb..#Temp') IS NOT NULL 
DROP TABLE #Temp 

;With cte(TimeSeconds, TagID, Value) 
AS 
(
SELECT 1378700244,'A1',3.75 Union all 
SELECT 1378700245,'A1',30 Union all 
SELECT 1378700304,'A1',1.2 Union all 
SELECT 1378700305,'A2',56 Union all 
SELECT 1378700344,'A2',11 Union all 
SELECT 1378700345,'A3',0.53 Union all 
SELECT 1378700364,'A1',4 Union all 
SELECT 1378700365,'A1',14.5 Union all 
SELECT 1378700384,'A1',144 Union all 
SELECT 1378700384,'A4',10 
) 
SELECT * INTO #temp From cte 

DECLARE @cols Nvarchar(max), 
     @sql Nvarchar(max), 
     @sql2 Nvarchar(max), 
     @cols2 Nvarchar(max) 


SET @cols = STUFF((SELECT DISTINCT ',' + 'ISNULL('+ TagID +',''0'')'+' AS '+ QUOTENAME(TagID) FROM #temp 
      ORDER BY 1 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)'),1,1,'') 


SET @cols2 = STUFF((SELECT DISTINCT ',' + QUOTENAME(TagID) FROM #temp 
      ORDER BY 1 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)'),1,1,'') 


SET @sql = 'SELECT TimeSeconds, ' + @cols + ' INTO #Temp1 
       FROM 
      (
       SELECT TimeSeconds, TagID, Value 
       FROM #Temp 
      ) s 
      PIVOT 
      (
       MAX(Value) FOR TagID IN (' + @cols2 + ') 
      ) p' 

PRINT @sql 

SET @sql2='SELECT TimeSeconds,'+ @cols + ' FROM #temp1' 

PRINT @sql2 

EXECUTE(@sql) 

EXECUTE(@sql2) 
関連する問題