2016-09-15 5 views
2

Как поставить результаты запроса ниже в таблице temp?Сохранение значений внутри таблицы temp

Следующий запрос дает мне некоторый набор результатов. Мне нужно, чтобы сохранить результат, установленный в таблице темп, чтобы я мог выполнять некоторые соединяется с этой таблицей темп

Declare @cols nvarchar(max),@query nvarchar(max) 
select @cols = 
stuff((select ',[' + Ltrim(rtrim(costelement)) +']' from WECCostElementsCalculation FOR XML PATH('')),1,1,''); 

select @query= 
'with T as 
(select wch.WECCostElementHeaderID,wceyb.WECCostElementsBreakUpID ,wch.WECCostID,WCEYB.ServiceTypeID,WCEYB.WarrantyCoverageID,wecec.CostElement,weceb.Cost 
from WECCostElementsHeader WCH inner join WECCostElementsYearBreakUp WCEYB on WCH.WECCostElementHeaderID 
=WCEYB.WECCostElementHeaderID INNER JOIN WECCostElementsBreakUp wecEB on wecEB.WECCostElementsBreakUpID=WCEYB.WECCostElementsBreakUpID 
left join WECCostElementsCalculation wecec on wecEB.WECCostElementID = wecec.WECCostElementID 
) 
select * from T 
PIVOT 
(SUM(Cost) FOR CostElement IN ('[email protected]+')) as pvt' 

exec sp_executesql @query 

ответ

1

Использование SELECT INTO:

select * 
into ##temp 
from T 
PIVOT 

Затем после exec sp_executesql @query

SELECT * FROM ##temp 

В случае использования временной таблицы, которую необходимо добавить в верхней части основного запроса или его динамической части:

IF OBJECT_ID(N'##temp') IS NOT NULL DROP TABLE ##temp; 
+0

Заявить, что это глобальная временная таблица является рискованной, особенно если она будет называться «temp», что слишком часто. Кроме того, как насчет последующих исполнений хранимой процедуры? Он должен будет изменить запрос, поскольку таблица будет существовать после первого выполнения. –

+0

@RaduGheorghiu Любое другое имя, это не проблема. Он может генерироваться динамически. – gofr1

+0

Это решение сработало для меня. – havin

1

Сначала необходимо создать таблицу, в которую вы собираетесь хранить данные, возвращаемые хранимой процедуры. Убедитесь, что таблица имеет точные столбцы в виде набора результатов из хранимой процедуры.

CREATE TABLE #TempTable (WECCostElementHeaderID int, etc. ...) 

Теперь, чтобы вставить данные в таблицу все что вам нужно сделать, это:

INSERT INTO #TempTable 
exec sp_executesql @query 

Только для быстрых целей тестирования:

create table #TempTable (id int) 

declare @query nvarchar(100) 

set @query = 'select 1 as id union select 2' 

insert into #TempTable 
exec sp_executesql @query 

select * 
from #TempTable 
+0

OP использует динамический SQL, и он не знает имена столбцов и типы данных. – gofr1

+0

@ gofr1 Вы правы в этом, но это был не его вопрос :) Может быть, он всегда будет получать те же столбцы, или, может быть, столбцы, которые он выберет, со временем изменятся очень мало, и он может позволить себе обновить таблицу иногда. –

+1

Может быть :) Это всего лишь примечание. – gofr1

1

вы должны создать временную таблицу и просто положил Insert INTO #Temporary_Table(Col1,Col2,....) до exec sp_executesql @query заявление. так же, как показано ниже: -

DECLARE @cols NVARCHAR(max) 
    ,@query NVARCHAR(max) 

SELECT @cols = stuff((
      SELECT ',[' + Ltrim(rtrim(costelement)) + ']' 
      FROM WECCostElementsCalculation 
      FOR XML PATH('') 
      ), 1, 1, ''); 

CREATE TABLE #Temporary_table(Col1 datatype,Col2 datatype,Col3.....) 


SELECT @query = 'with T as 
(select wch.WECCostElementHeaderID,wceyb.WECCostElementsBreakUpID ,wch.WECCostID,WCEYB.ServiceTypeID,WCEYB.WarrantyCoverageID,wecec.CostElement,weceb.Cost 
from WECCostElementsHeader WCH inner join WECCostElementsYearBreakUp WCEYB on WCH.WECCostElementHeaderID 
=WCEYB.WECCostElementHeaderID INNER JOIN WECCostElementsBreakUp wecEB on wecEB.WECCostElementsBreakUpID=WCEYB.WECCostElementsBreakUpID 
left join WECCostElementsCalculation wecec on wecEB.WECCostElementID = wecec.WECCostElementID 
) 
select * from T 
PIVOT 
(SUM(Cost) FOR CostElement IN (' + @cols + ')) as pvt' 

INSERT INTO #Temporary_table(Col1,Col2,Col3.....) 
EXEC sp_executesql @query 

SELECT * FROM #Temporary_table 
+0

Число столбцов динамическое. Таким образом, вы не можете создать таблицу для результатов с основным запросом - она ​​должна быть в динамической части. В этом случае типы данных столбцов должны быть получены из системных таблиц ... – gofr1

+0

Привет @cols в разделе сводной таблицы генерируется динамически. Как я могу создать временную таблицу для того же самого. – havin