SSRS使用SQL Server作为后端存储其详细信息,Catalog表用于以二进制形式存储报告文件。下面的脚本仅从Catalog表中提取报告定义,并使用BCP实用程序将其导出到预定义路径作为.rdl文件。
要从TSQL使用BCP实用程序,我们需要执行“xp_cmdshell”命令;它默认处于禁用状态。因此,首先需要执行以下脚本以启用它-
-- 允许更改高级选项。 EXEC sp_configure 'show advanced options',1 GO
-- 更新高级选项的当前配置值。 RECONFIGURE GO
-- 启用xp_cmdshell EXEC sp_configure 'xp_cmdshell',1 GO
-- 更新xp_cmdshell的当前配置值。 RECONFIGURE GO
-- 禁止更改其他高级选项。 EXEC sp_configure 'show advanced options',0 GO
-- 更新高级选项的当前配置值。 RECONFIGURE GO
成功执行后,可以执行以下脚本并进行所需更改以下载文件-
DECLARE @FilterReportPath AS VARCHAR(500) = NULL
DECLARE @FilterReportName AS VARCHAR(500) = NULL
DECLARE @OutputPath AS VARCHAR(500) = 'D:\Reports\Download\'
DECLARE @TSQL AS NVARCHAR(MAX)
SET @OutputPath = REPLACE(@OutputPath, '\', '/')
IF LTRIM(RTRIM(ISNULL(@OutputPath, ''))) = ''
BEGIN
SELECT 'Invalid Output Path'
END
ELSE
BEGIN
SET @TSQL = STUFF((SELECT ';EXEC master..xp_cmdshell ''bcp " ' + ' SELECT ' + ' CONVERT(VARCHAR(MAX), ' + ' CASE ' + ' WHEN LEFT(C.Content,3) = 0xEFBBBF THEN STUFF(C.Content,1,3,'''''''') '+ ' ELSE C.Content '+ '
END) ' + ' FROM ' + ' [ReportServer].[dbo].[Catalog] CL ' + ' CROSS APPLY (SELECT CONVERT(VARBINARY(MAX),CL.Content) Content) C ' + ' WHERE ' + ' CL.ItemID = ''''' + CONVERT(VARCHAR(MAX), CL.ItemID) + ''''' " queryout "' + @OutputPath + '' + CL.Name + '.rdl" ' + '-T -c -x'''
FROM [ReportServer].[dbo].[Catalog] CL
WHERE CL.[Type] = 2 --Report AND '/' + CL.[Path] + '/' LIKE COALESCE('%/%' + @FilterReportPath + '%/%', '/' + CL.[Path] + '/') AND CL.Name LIKE COALESCE('%' + @FilterReportName + '%', CL.Name)
FOR XML PATH('')), 1, 1, '')
EXEC SP_EXECUTESQL @TSQL
END