完全な質問:PowershellスクリプトでInvoke SQLコマンドを使用し、スナップピンを使用している場合、SQLジョブに含める必要があります。PowershellのSQL Serverバージョンはやや機能不全です。回避策を知っている人はいますか?
私が収集したものから、SQL Management StudioのバージョンのPowerShellは十分に機能しておらず、スナップピンを使用できません。そのため、スクリプトで使用したコマンドレットを認識しません。Powershellスクリプトではなくコマンドラインプロンプトとしてジョブで実行しようとしましたが、コードがある程度機能するようになりましたが、ジョブの履歴を確認すると、invoke-sqlはまだ認識されたコマンドレットではないと表示されます。私はリモートサーバーでコードを実行しているため、標準とは異なるクレデンシャルを使用して、スナップピンがプリロードされたプロファイルがロードされていないと推測しますが、これは多少疑わしいです。
また、私はPowerShellの新人なので、コーディングの実践やコードの合理化に関するアドバイスをいただければ幸いです。
コードは次のとおりです。
# define parameters
param
(
$file = "\\server\folder\file.ps1"
)
"invoke-sqlcmd -query """ | out-file "\\server\folder\file.ps1"
# retrieve set of table objects
$path = invoke-sqlcmd -query "select TableName from table WITH (NoLock)" -database db -server server
[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$so = New-Object Microsoft.SqlServer.Management.Smo.ScriptingOptions
$so.DriPrimaryKey = $false
$so.Nocollation = $true
$so.IncludeIfNotExists = $true
$so.NoIdentities = $true
$so.AnsiPadding = $false
# script each table
foreach ($table in $path)
{
#$holder = $table
$table = get-item sqlserver:\sql\server\default\databases\database\tables\dbo.$($table.TableName)
$table.script($so) | out-file -append $file
}
(get-content "\\server\folder\file.ps1") -notmatch "ANSI_NULLS" | out-file "\\server\folder\file.ps1"
(get-content "\\server\folder\file.ps1") -notmatch " AS "| out-file "\\server\folder\file.ps1"
(get-content "\\server\folder\file.ps1") -notmatch "Quoted_" | out-file "\\server\folder\file.ps1"
(get-content "\\server\folder\file.ps1") -replace "\) ON \[PRIMARY\].*", ")" | out-file "\\server\folder\file.ps1"
(get-content "\\server\folder\file.ps1") -replace "\[text\]", "[nvarchar](max)" | out-file "\\server\folder\file.ps1"
(get-content "\\server\folder\file.ps1") -replace " SPARSE ", "" | out-file "\\server\folder\file.ps1"
(get-content "\\server\folder\file.ps1") -replace "COLUMN_SET FOR ALL_SPARSE_COLUMNS", "" | out-file "\\server\folder\file.ps1"
""" -database database -server server" | out-file "\\server\folder\file.ps1" -append