web-dev-qa-db-ja.com

CmdExecステップのSQLエージェント組み込みPowerShellスクリプトがimport-module sqlpsで失敗する

SQL Server 2008R2 PowerShell 2.1

SSISを使用せずに、インスタンス上の破損していないすべてのSSASデータベースを動的にバックアップするSQLエージェントジョブを作成しようとしています。 SQLエージェントジョブで、CmdExecステップを作成し、次のようなPowerShellスクリプトファイル(.ps1)をポイントすると、

powershell.exe "c:\MyPSFile.ps1" 

ジョブは正常に実行されます(または、少なくともロジックまたはその他の構文の問題に遭遇するだけの十分な距離になります)。

SQLの内部にPowerShellスクリプトを保持する必要があるため、このアプローチは最終的なソリューションでは機能しません。したがって、PowerShellスクリプトを次のように埋め込む別のCmdExecステップがあります。

powershell.exe "import-module sqlps –DisableNameChecking

$server_name = "localhost"
$backup_location = "C:\BackupsGoHere"

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.AnalysisServices") | out-null
$server = New-Object Microsoft.AnalysisServices.Server
$server.connect($server_name)

# Generate an array of databases to be backed up
foreach ($database in ($server.get_Databases() | Where {$_.EstimatedSize -gt 0 -and $_.Cubes.Count -gt 0})) {
    $directory_path = $backup_location + "\" + $database.Name
    if (!(Test-Path -Path $directory_path)) {
        New-Item $directory_path -type directory | out-null
    }
    [string] $timestamp = date
    $timestamp = $timestamp.Replace(':','').Replace('/','-').Replace(' ','-')
    $database.Backup("$directory_path\$database-$timestamp.abf")
}
$server.disconnect()"

ただし、埋め込みスクリプトを使用して実行すると、ジョブは次の応答ですばやくエラーになります。

モジュールディレクトリに有効なモジュールファイルが見つからなかったため、指定されたモジュール 'sqlps'はロードされませんでした。

埋め込まれたスクリプトからモジュールを参照できないのに、ps1ファイルで参照しても問題ないのはなぜですか?

4
dev_etter

SQL Server 2008 R2を使用しているため、CmdExecを使用する代わりに、ステップを「PowerShell」タイプとして構成したSQLエージェントジョブを作成できます。スクリプトの「肉」を含めるだけで済みます。 SQLタイプのステップのPowerShellタイプを使用しているため、Powershell.exeがすでに呼び出され、SQLPSモジュールがインポートされています。だから例: enter image description here

あなたのコードで、以下に示すようにステップを簡単に設定できると思います: enter image description here

2
user507