-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

这是因为 '#' 临时表仅在当前连接期间保留,并且仅在其范围内可见。即使您创建了一个临时表,在 SSMS 中打开另一个选项卡并尝试使用它,您也会看到“表不存在”错误。发生的情况是,您的 EXEC 语句创建了 #Temp 表,当它完成时,该表立即被删除。不仅如此 - CREATE 语句中的#Temp 表和 EXEC 语句中的#Temp 实际上是不同的表!尝试在不同的 SSMS 选项卡中创建两个 #temp 表,您会发现它们实际上并不相同。

您可以使用全局临时表。只需将名称更改为 ##Temp 即可。运行这两个示例。

这不起作用:

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

而这个会(当你第二次运行它时,你会注意到“表已存在”错误:

EXEC('select * into ##Temp from (select ''something'' as x) x');
select * from ##Temp
于 2013-03-14T09:46:30.753 回答
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

或者只是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 回答