проблема при сохранении в Excel с использованием хранимой процедуры SQL с динамическим SQL - PullRequest
0 голосов
/ 05 мая 2011

хранимая процедура:

alter  PROCEDURE usp_dailyjobwisereport_dayshift            
as             
/*                
exec usp_dailyjobwisereport_dayshift          
*/                
SET NOCOUNT ON                

begin              

delete from machinejob_report;

 insert into  machinejob_report   
    select coalesce(cast(description_name as varchar(28)), 'Grand Total:') as descriptionname, 
    sum(case when vfrm.job_id = '1001' then DateDiff(mi, 0, total_time)  end) as  CRATE_SMALL ,       
    sum(case when vfrm.job_id = '1002' then DateDiff(mi, 0, total_time)  end) as  CRATE_MEDIUM ,                  
    sum(case when vfrm.job_id = '9999' then DateDiff(mi, 0, total_time)  end) as  NO_SCHEDULE
    from    ven_fullreportmaster vfrm
             INNER JOIN ven_descriptionmaster VDM ON VDM.description_id = vfrm.description_id
          -- inner join ven_machinemaster vm on  vm.machine_id = vfrm..machine_id
                        where  vfrm.entry_date = convert(varchar, getdate()-9, 105)  
                      and  vfrm.shift_id =1 
                      and vfrm.description_id in (1,3,5)
                      and vfrm.is_task_completed ='Y' 
          group by   description_name  with rollup

 if (1=2) 
 begin
 select system_type_id, user_type_id from sys.types
end

 DECLARE @dynsql NVARCHAR(MAX)  
SELECT @dynsql = 
  CASE WHEN j1001>0 THEN ',j1001' ELSE '' END +                    
  CASE WHEN j1002>0 THEN ',j1002' ELSE '' END +        
  CASE WHEN j9999>0 THEN ',j9999' ELSE '' END               
  FROM machinejob_report  
  WHERE  machinename = 'Grand Total:'  
  IF(LEN(@dynsql) > 0)     
 BEGIN  
   /*
     DECLARE @f NVARCHAR(MAX) 
    SELECT @f = COALESCE(@dynsql + ', ', '') + field FROM  ven_machinejob_report_temp  
    SET @dynsql = 'SELECT machinename ' + @f + ' FROM machinejob_report' 
  */
 SET @dynsql = STUFF(@dynsql,1,1,'SELECT machinename, ') + ' FROM machinejob_report'     
 EXEC(@dynsql)    
 END 

end                  

SET NOCOUNT OFF

Вывод вышеуказанной процедуры:

  machinename     j1001     j1002     j9999
   EC              270      NULL       200
   RUN             NULL      420       300
   Grand Total:    270       420       500  

Еще одна процедура для сохранения его в xls:

alter procedure usp_dailyjobwisereport_dayshift_excel   
(    
  @db_name varchar(100), @schm_name varchar(100), @table_name varchar(100),@file_name  varchar(100)    
 )    
 as    

 --Generate column names as a recordset    
 declare @columns varchar(8000), @sql varchar(8000), @data_file varchar(100)    

set @columns = '''machinename'' as machinename,''1001'' as job1001, ''1002'' as job1002 , ''9999'' as job9999'; 

    --Create a dummy file to have actual data    
   select @data_file=substring(@file_name,1,len(@file_name)-charindex('\',reverse(@file_name)))+'\data_file.csv'    

  --Generate column names in the passed EXCEL file    
  set @sql='bcp " select * from (select '+@columns+') as t" queryout   c:\test.csv  -c -t,  -T -S ' + @@servername    
  exec master..xp_cmdshell @sql   

    --Generate data in the dummy file    
    set @sql='bcp "exec Test..usp_dailyjobwisereport_dayshift " queryout   c:\data_file.csv  -c -t,  -T -S ' + @@servername    
   exec master..xp_cmdshell @sql    

 --Copy dummy file to passed EXCEL file    
   set @sql= 'exec master..xp_cmdshell ''type '+@data_file+' >> "'+@file_name+'"'''    
  exec(@sql)    

--Delete dummy file     
--set @sql= 'exec master..xp_cmdshell ''del '+@data_file+''''    
--exec(@sql)    

--EXEC usp_dailyjobwisereport_dayshift_excel Test','[dbo]', 'usp_dailyjobwisereport_dayshift','c:\test.csv'   

Когда я выполняю описанную выше процедуру ... она не показывает никакой ошибки ... но только один столбец сохраняется в файле .csv /.xls ...

Вывод в файл .csv:

  EC   

Пожалуйста, помогите мне решить эту проблему ...

Решение:

Я создал другую динамическую таблицу в вышеописанной процедуре рядом с оператором динамического выбора и вставил результирующий набор в эту таблицу и

 set @f = STUFF(@dyncreate,1,6,'create table ven_machinejob_report_temp( descriptionname nvarchar(111),' )  + '   int )'
  exec(@f)
  insert into ven_machinejob_report_temp   
  EXEC(@dynsql)

снова использовал эту вновь созданную таблицу в процедуре ее сохранения в xls:

 --Generate data in the dummy file    
 set @sql='bcp " select * from Test..ven_machinejob_report_temp " queryout   c:\data_file.csv  -c -t,  -T -S ' + @@servername    
 exec master..xp_cmdshell @sql   

и теперь я могу получить все строки в листе Excel

1 Ответ

1 голос
/ 29 июля 2011

Возможно, вам будет легче выполнить эту работу в службах интеграции SQL Server (SSIS). Он специально разработан для таких вещей.

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

Надеюсь, это имеет смысл для вас.

http://msdn.microsoft.com/en-us/library/ms169917.aspx

...