SSRS - Download All Report Files Or Single (RDL) From ReportServer

Hi friends! Today, my manager asked me to download all the reports from ReportServer and check in to TFS.

There were plenty of reports --  almost 1,000 -- so it was difficult to download one by one. I thought this kind of problem comes to most DBAs, so I decided to write this blog. I found this script on Google and modified it-

Prerequisites & Notes

  1. xp_cmdshell should be enabled. (Part 1).
  2. SQL Engine Account should have proper write permission on Output Folder, where you will get all your reports.
  3. Please read comments before execution and follow (Part 2).
Change the ReportServer database on the query.



Part 1
 
Enable xp_cmdshell 
  1. EXEC sp_configure 'show advanced options', 1  
  2. GO  
  3. RECONFIGURE  
  4. GO  
  5. EXEC sp_configure 'xp_cmdshell', 1  
  6. GO  
  7. RECONFIGURE  
  8. GO  
  9. EXEC sp_configure 'show advanced options', 0  
  10. GO  
  11. RECONFIGURE  
  12. GO   

Part 2

Script Implementation 
  1. /*  
  2.   
  3. If you want all reports in output folder whether they were published in different folders  
  4.   
  5. in SSRS Report Server then put Null else define folder name  
  6.   
  7. eg: DECLARE @ReportFolderPath AS VARCHAR(500) ='/Folder1/Folder2/'  
  8.   
  9. */  

   

  1. DECLARE @ReportFolderPath AS VARCHAR(500) = null  
  2. /*  
  3.   
  4. If you want some specific report then put its name else put Null  
  5.   
  6. eg: DECLARE @ReportName AS VARCHAR(500) = 'Bill'  
  7.   
  8. */  
  9. DECLARE @ReportName AS VARCHAR(500) = null  
  10. /*  
  11.   
  12. This is the output folder where reports will be generated. Make sure Sql Server Engine Account  
  13.   
  14. has proper permission on this  
  15.   
  16. */  
  17. DECLARE @OutputFolderLocation AS VARCHAR(500) = 'C:\ReportFolder\'  
  18.     --To check Folder path  
  19. SET @OutputFolderLocation = REPLACE(@OutputFolderLocation, '\',' / ')  
  20.         /*  
  21.   
  22.         This for bcp access to sql server. If you want to access through sql login use  
  23.   
  24.         eg : DECLARE @BCPComponents VARCHAR(1000)='-S"MachineName\SQL2012" -U"SA" -P"Pa$$word"'  
  25.   
  26.         or If you want from windows account having permission on sql then  
  27.   
  28.         eg : DECLARE @BCPComponents VARCHAR(1000)='-S"1MachineName\SQL2012"'  
  29.   
  30.         else null  
  31.   
  32.         */  
  33.         DECLARE @BCPComponents VARCHAR(1000) = null DECLARE @SqlQuery AS NVARCHAR(MAX) IF LTRIM(RTRIM(ISNULL(@OutputFolderLocation, ''))) = ''  
  34.         BEGIN SELECT 'Access denied!!!'  
  35.         END ELSE BEGIN SET @SqlQuery = STUFF((SELECT ';EXEC master..xp_cmdshell '  
  36.             'bcp " ' + ' SELECT ' + ' CONVERT(VARCHAR(MAX), ' + ' CASE ' + ' WHEN LEFT(C.Content,3) = 0xEFBBBF THEN STUFF(C.Content,1,3,'  
  37.             ''  
  38.             ''  
  39.             ''  
  40.             ') ' + ' ELSE C.Content ' + ' END) ' + ' FROM ' + ' [ReportServer$SQL2012].[dbo].[Catalog] CL ' + ' CROSS APPLY (SELECT CONVERT(VARBINARY(MAX),CL.Content) Content) C ' + ' WHERE ' + ' CL.ItemID = '  
  41.             ''  
  42.             '' + CONVERT(VARCHAR(MAX), CL.ItemID) + ''  
  43.             ''  
  44.             ' " queryout "' + @OutputFolderLocation + '' + CL.Name + '.rdl" ' + '-T -c -x ' + COALESCE(@BCPComponents, '') + ''  
  45.             ''  
  46.             FROM[ReportServer$SQL2012].[dbo].[Catalog] CL WHERE CL.[Type] = 2--Report AND '/' + CL.[Path] + '/'  
  47.             LIKE COALESCE('%/%' + @ReportFolderPath + '%/%''/' + CL.[Path] + '/'AND CL.Name LIKE COALESCE('%' + @ReportName + '%', CL.NameFOR XML PATH('')), 1, 1, ''SELECT @SqlQuery  
  48.         --Execute the Dynamic Query EXEC SP_EXECUTESQL @SqlQuery END