ahmed_sa Ответов: 1

Как выполнить результат хранимой процедуры во временную таблицу или переменную?


Как выполнить результат хранимой процедуры во временную таблицу ?

Я работаю на SQL server 2012, мне нужно получить результат, возвращенный из хранимой процедуры, и сохранить его во временную таблицу, переменную или любую другую вещь .

проблема в том, что дайте мне ошибку, когда это сделаете

ВЫБИРАТЬ *
В #TempTable
Из функции openrowset('файл sqlncli', 'сервер=AHMEDkhalid\Халид;trusted_connection=Да;','метод exec sp_ReportDetailsGetALL 3')
ГО

Я получаю ошибку

Сообщение 11514, Уровень 16, состояние 1, процедура процедура sp_describe_first_result_set, Линия 1
Метаданные не могут быть определены, поскольку оператор 'exec (@ColumnName)' в процедуре 'sp_ReportDetailsGetALL' содержит динамический SQL. Рассмотрите возможность использования предложения WITH RESULT SETS для явного описания результирующего набора.
возвращаемый результат является динамическим и возвращает различное содержимое результата и заголовки

моя процедура, как показано ниже


create proc  [dbo].[sp_ReportDetailsGetALL] 
@ReportID  nvarchar(20) , 
@ReportDateFrom nvarchar(20) = null, 
@ReportDateTo  nvarchar(20) = null  ,
@SearchString nvarchar(500)= '1=1' 
as


declare  @SortingColumns Nvarchar(200)  = (select SortingColumns from  [dbo].[Reports] where reportid=@ReportID )

if @ReportDateFrom is  null  and  @ReportDateTo is null  
begin 

declare @D  Date = (select Max(ReportDate) from  ReportDetails where  ReportID=@ReportID )


set  @ReportDateFrom =  @D   
set  @ReportDateTo =  @D   


end  




if (select  InRunTime from  [dbo].[Reports] where reportid=@ReportID )  =0
begin


if  (select  IsDownloaded from  [dbo].[Reports] where reportid=@ReportID  ) =0
begin

declare @ColumnName Nvarchar(max) = (SELECT 'select  ' + STUFF((SELECT ',' + 'Text'+CONVERT(varchar(20),ReportHeaderIndex) + ' '+ '['+ReportHeader +']'
            FROM ReportHeaders where ReportID=@ReportID order  by  ReportHeaderIndex 
            FOR XML PATH('')) ,1,1,'') +  ' , convert(nvarchar(20),[ReportDate]) ReportDate  From  ReportDetails R where  ReportDate >= ''' +@ReportDateFrom+'''  and  ReportDate <= '''+ @ReportDateTo  +'''  and  R.ReportID =' +  @ReportID  + '  and  '+@SearchString+'  and IsHistory=0  order by  reportdate desc ' + @SortingColumns AS Txt   )
exec   (@ColumnName) 

end
else  
begin


 select 
   [Conflict Report Name], [# of Parts], [# of Exceptions], [# of Parts Need to Check] , 
ReportDate  , ReportLink 
 from  
 ( select  ROW_NUMBER() OVER(Partition by Text1 ORDER BY ReportDate desc) AS Row_Number_,  Text1 [Conflict Report Name],Text2 [# of Parts],Text3 [# of Exceptions],Text4 [# of Parts Need to Check] , 
convert(nvarchar(20),[ReportDate]) ReportDate  , ReportLink   
From  ReportDetails R where  R.ReportID =9 and ishistory=0) T where  Row_Number_ =1 

order by  reportdate desc  


 
end


end
else
begin
declare @S  nvarchar(200) = (select [ProcedureName]  from  [dbo].[Reports] where reportid=@ReportID  ) 

exec (@S)

end


Если есть какой-то способ решить эту проблему без использования openrowset, я принимаю это

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

Что я уже пробовал:

SELECT *
INTO #TempTable
FROM OPENROWSET('SQLNCLI', 'Server=AHMED-SALAH-PC\AHMEDSA;Trusted_Connection=yes;','EXEC sp_ReportDetailsGetALL 3')

EXEC('exec DashBoardDB.[dbo].sp_ReportDetailsGetALL 3 WITH RESULT SETS (( ReportID int));')

1 Ответов

Рейтинг:
10

RickZeeland

Вы должны создать таблицу явно, см. объяснение здесь: Выполнить хранимую процедуру во временную таблицу – SQLServerCentral[^]