-1

ピボットの結果を生成する select ステートメントを使用して、データを一時テーブルにコピーしています。

私の手順は次のとおりです。

alter procedure proc11 AS

create Table #Temp (Software varchar(max), Ver varchar(max))

declare @cols varchar(max)
declare @colTabl varchar(max)
declare @alter varchar(max)

set @cols=STUFF((select distinct  ',[' + Ltrim(rtrim(YEAR(Dt))) +']' from temp FOR XML PATH('')),1,1,'');

set @colTabl=STUFF((select distinct  '[' + Ltrim(rtrim(YEAR(Dt))) +'] int,' from temp FOR XML PATH('')),1,0,'');

set @colTabl= LEFT(@colTabl,len(@colTabl)-1);

set @alter = 'alter table #Temp add  '+ @colTabl;

exec(@alter)

EXEC('select * into #Temp from 
(select YEAR(Dt)[year],Software,Ver from temp)T
Pivot(count([year]) for [year] in ('+@cols+'))PVT')

しかし、ステートメントselect * from #Tempはレコードを返しません。

これらのレコードをコピーするにはどうすればよいですか。

助けてください。前もって感謝します。

4

3 に答える 3

0
EXEC('insert #Temp select * from 
(select YEAR(Dt)[year],Software,Ver from temp)T 
Pivot(count([year]) for [year] in ('+@cols+'))PVT order by Software')
于 2013-03-14T10:47:41.010 に答える
0

これは、'#' 一時テーブルが現在の接続の間だけ保持され、そのスコープ内でのみ表示されるためです。一時テーブルを作成し、SSMS で別のタブを開いて使用しようとしても、「テーブルが存在しません」というエラーが表示されます。つまり、EXEC ステートメントが #Temp テーブルを作成し、それが終了すると、テーブルはすぐに削除されます。それだけでなく、CREATE ステートメントからの #Temp テーブルと、EXEC ステートメントからの #Temp は、実際には異なるテーブルです。異なる SSMS タブで 2 つの #temp テーブルを作成してみると、実際には同じではないことがわかります。

グローバル一時テーブルを使用できます。名前を ##Temp に変更するだけで機能します。これら 2 つの例を実行します。

これはうまくいきません:

EXEC('select * into #Temp from (select ''something'' as x) x');
select * from #Temp

そして、これは(2回目に実行すると、「テーブルが既に存在します」というエラーに気付くでしょう:

EXEC('select * into ##Temp from (select ''something'' as x) x');
select * from ##Temp
于 2013-03-14T09:46:30.753 に答える
0

INSERTまたは、単に動的部分から を削除します。

INSERT INTO #temp
EXEC(select * from 
    (select YEAR(Dt)[year],Software,Ver from temp)T 
    Pivot(count([year]) for [year] in ('+@cols+'))PVT order by Software')
于 2013-10-15T20:08:03.760 に答える