web-dev-qa-db-ja.com

SQL Server Reporting Services:プログラムでスクリプトを生成する

SSRS 2005からSSRS 2017にSSRSレポートをエクスポートしようとしています。移動するレポートは約100ありますが、これらのすべてのレポートで合計で約500のサブスクリプションがあります。

SSMS 2005のScript to fileツールは時間を大幅に節約しますが、Script to file関数をプログラムで呼び出す方法はありますか?

データベースをエクスポートするためにPowershellで同様のことを実行できることを知っています。

2
user149397

ジョブを転送するだけで、PowershellがレポートのGUIDをどの程度適切に処理できるかわかりませんが、 rs.exe を使用してスクリプトファイルを実行し、Webサービスを呼び出してダウンロード/コピー/ Reporting Servicesオブジェクトを展開します。

レポートサーバー間でコンテンツをコピーするためのサンプルReporting Services rs.exeスクリプト には、ネイティブスケジュールとSharePoint統合インスタンスの両方で共有スケジュールがサポートされていると記載されています。

以前は、スクリプトを作成するためのGUIを提供する「rsscripter」と呼ばれるツールがありましたが、それがより新しいバージョンでどれほどうまく機能するかはわかりません。これは SQL Server Fine Build に含まれており、次のようになります。

enter image description here

そのツールの元の記事は、archive.orgにまだあります Reporting Services Scripterをダウンロード

この関数は、SQL Serverの移行を容易にするために作成しましたが、1つのサーバーでエージェントジョブを実行し、それらを.sqlファイルとしてディスクに書き込みます。

Function Write-SQLAgentJobs([string]$ServerInstance, [string]$ExportPath)
{

    #Create Directory if needed.
    If((Test-Path -LiteralPath $ExportPath -PathType Container) -eq  $false)
    {
        New-Item -Path $ExportPath -ItemType Container | Out-Null 
        Write-Debug -Message "$(Get-Date) - Creating Export Path $($ExportPath)"
    }

    #Get the Additional Modules needed for doing the work.
    [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null 

    $SMO = new-object ('Microsoft.SqlServer.Management.Smo.Server') $ServerInstance 

    #Build Up Scripter Object...
    $Scripter = new-object ('Microsoft.SqlServer.Management.Smo.Scripter') ($SMO)
    $ScriptOptions = New-Object ('Microsoft.SqlServer.Management.Smo.ScriptingOptions')

    $Scripter.Options.ScriptDrops = $False
    $Scripter.Options.WithDependencies = $False
    $Scripter.Options.IncludeHeaders = $True
    $Scripter.Options.AppendToFile = $False
    $Scripter.Options.ToFileOnly = $True
    $Scripter.Options.ClusteredIndexes = $True
    $Scripter.Options.DriAll = $True
    $Scripter.Options.Indexes = $True
    $Scripter.Options.Triggers = $True

    $Scripter.Options = $ScriptOptions

    ForEach($Job In ($SMO.JobServer.Jobs | Where-Object -FilterScript {$_.name -ne ""}))
    {

        $JobName = ConvertTo-ValidPath -TestPath ($Job.name)
        $FileName = [System.IO.Path]::Combine($ExportPath, "$($JobName).sql")

        If((Test-Path -LiteralPath $FileName -PathType leaf) -eq $true)
        {
            Remove-Item -LiteralPath $FileName -Force -ErrorAction SilentlyContinue | Out-Null
        }

        $Scripter.Options.FileName = $FileName
        $Scripter.Script($Job) | Out-Null 

    }

}

Function ConvertTo-ValidPath([string]$TestPath)
{

    $invalidChars = [IO.Path]::GetInvalidFileNameChars() -join ''
    $re = "[{0}]" -f [RegEx]::Escape($invalidChars)

    Write-Output ($TestPath -replace $re)

}
0
Jonathan Fite