SSRS 下载所有历史快照

SSRS Download All History Snapshots

是否可以一次下载一个报表的所有历史快照?最好是 CSV。将节省大量时间,而不是单独单击每个文件并选择另存为 CSV。

我只看到 Delete

的选项

在 PowerShell 中,您可以循环遍历每个快照并使用此示例保存它们:

<#
    Description: Save SSRS Report Snapshots

#>

$sql = "
    DECLARE @ReportName    NVARCHAR(200) = 'Your Report Name'; --change to NULL for every snapshot
    DECLARE @FileFormat    NVARCHAR(50) = 'CSV'; --HTML5,PPTX,ATOM,HTML4.0,MHTML,IMAGE,EXCEL (for .xls),EXCELOPENXML (for .xlsx),WORD (for .doc),WORDOPENXML (for .docx),CSV,PDF,XML
    DECLARE @FileExtn      NVARCHAR(50) = 'csv'; 
    DECLARE @ServerName    NVARCHAR(100) = 'http://YourServerName';
    DECLARE @DateFrom      DATE = CAST(DATEADD(DAY, -1, GETDATE()) AS DATE); --change to NULL for every snapshot
    DECLARE @ExportPath    NVARCHAR(200) = 'C:\Temp\';

    SELECT 
        --[ReportID] = [c].[itemid]  
     --  , [ReportName] = [c].[name]  
     --  , [ReportPath] = [c].[path]  
     --  , [SnaphsotDate] = FORMAT([h].[snapshotdate], 'dd-MMM-yyyy')
     --  , [SnapshotDescription] = [s].[DESCRIPTION]  
     --  , [SnapshotEffectiveParams] = [s].[effectiveparams]
     --  , [SnapshotQueryParams] = [s].[queryparams]
     --  , [ScheduleName] = [sc].[name] 
     --  , [ScheduleNextRunTime] = CONVERT(VARCHAR(20), [sc].[nextruntime], 113) 
         [ExportFileName] = @ExportPath + REPLACE([c].[name], ' ', '_') + '_' + FORMAT([h].[snapshotdate], 'yyyyMMdd_HHmm') + '.' + @FileExtn
       , [SnapshotUrl] = 
            @ServerName 
          + '/ReportServer/Pages/ReportViewer.aspx?' 
          + [c].[path] + '&rs:Command=Render&rs:Format=' 
          + @FileFormat + '&rs:Snapshot=' 
          + FORMAT([h].[snapshotdate], 'yyyy-MM-ddTHH:mm:ss')
    FROM
        [ReportServer].[dbo].[History] AS [h] WITH(NOLOCK)
        INNER JOIN [ReportServer].[dbo].[SnapshotData] AS [s] WITH(NOLOCK) ON [h].[snapshotdataid] = [s].[snapshotdataid]
        INNER JOIN [ReportServer].[dbo].[Catalog] AS [c] WITH(NOLOCK) ON [c].[itemid] = [h].[reportid]
        INNER JOIN [ReportServer].[dbo].[ReportSchedule] AS [rs] WITH(NOLOCK) ON [rs].[reportid] = [h].[reportid]
        INNER JOIN [ReportServer].[dbo].[Schedule] AS [sc] WITH(NOLOCK) ON [sc].[scheduleid] = [rs].[scheduleid]
    WHERE
       1=1
       AND [rs].[reportaction] = 2 
       AND (@ReportName IS NULL OR [c].[Name] = @ReportName)
       AND (@DateFrom IS NULL OR [h].[snapshotdate] >= CAST(DATEADD(DAY, -1, GETDATE()) AS DATE))
    ORDER BY 
         [c].[name]
       , [h].[snapshotdate];
                        ;"

    $server = 'YourServerName'; 
    $dbs = 'MASTER';
    $dsn = "Data Source=$server; Initial Catalog=$dbs; Integrated Security=SSPI;"; 
    $cn = New-Object System.Data.SqlClient.SqlConnection($dsn); 

    #execute merge statement here with parameters
    $cn = New-Object System.Data.SqlClient.SqlConnection($dsn);
    $cn.Open(); 

    $cmd = $cn.CreateCommand();
    $cmd.CommandText = $sql
    $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
    $SqlAdapter.SelectCommand = $cmd
    $cmd.Connection = $cn
    $ds = New-Object System.Data.DataSet
    $SqlAdapter.Fill($ds)
    $cn.Close()
    $Result = $ds.Tables[0]

    Foreach ($item in $Result) 
    {
        #Write-Host $item.name

        $SnapshotUrl = $item.SnapshotUrl
        $ExportFileName = $item.ExportFileName
        (Invoke-WebRequest -Uri $SnapshotUrl -OutFile $ExportFileName -UseDefaultCredentials -TimeoutSec 240);
    }

https://docs.microsoft.com/en-us/sql/reporting-services/url-access-parameter-reference?view=sql-server-ver15

在使用 powershell 时遇到问题,所以我想 post 我的粗略 Python 解决方案的简化版本,灵感来自 @aduguid 的答案。

import requests
from requests_negotiate_sspi import HttpNegotiateAuth
import os

def downloadFile(url, file_name, download_folder, session):
    response = session.get(url, stream=True) # open the download link
    file_path = os.path.join(download_folder, file_name)
    with open(file_path, 'wb') as file: # create a new file with write binary mode
        for chunk in response.iter_content(chunk_size=1024):
            if chunk:
                file.write(chunk)

# Can also use '/Reports()' for non-linked reports.
# Can also pass in 'path="<report_path>"' instead of using id numbers,
# e.g. '.../Reports(path="/cool%20reports/my%20report")/HistorySnapshots'
api_url = r'http://<server_name>/reports/api/v2.0/LinkedReports(<item_id>)/HistorySnapshots'
session = requests.session()
session.auth = HttpNegotiateAuth() # uses windows log in
response = session.get(api_url)
hs_snapshot_list = response.json()['value']

for item_dict in hs_snapshot_list:
    download_url = (r'http://<server_name>/ReportServer/Pages/ReportViewer.aspx?<report_path>'
                    + '&rs:Snapshot=' + item_dict['HistoryId']
                    + '&rs:Format=CSV')
    downloadFile(download_url, '<your_file_name>', '<your_download_folder>', session)

SSRS API 资源: https://app.swaggerhub.com/apis/microsoft-rs/SSRS/2.0#/Reports/GetReportHistorySnapshots