お世話になっております。
■関連記事
https://teratail.com/questions/175395
少々引用させていただきます。
現在PowerShellから
sqlファイルに定義されているSELECT文からTSVファイルを出力するpgを作成中です。
$DBSERVER = "aaaa"
$DB = "bbbb"
$ID = "xxxx"
$PASSWORD = "yyyy"
$SQLFILE = "C:xxx\yyy\zzz.sql"
$TSV = "C:aaa\bbb\ccc\ddd.tsv"
$Result = Invoke-Sqlcmd `
-ServerInstance $DBSERVER `
-Database $DB `
-Username $ID `
-Password $PASSWORD `
-InputFile $SQLFILE `
-Verbose -OutputSqlErrors $true | Export-Csv $TSV -NoTypeInformation -Encoding Unicode -Delimiter "`t"
上記PGにてSQLからTSV出力が可能となりました。
ここで、試しにSQLファイルを修正し、存在しない列を参照する様変更して
実行した結果、コンソール上でエラーメッセージは表示されたのですが、
そのメッセージを保持したいです。
Invoke-Sqlcmd : Invalid column name 'XXXXX'.
発生場所 c:YYYYYYY.ps1:54 文字:8
+ $Result = Invoke-Sqlcmd ...
+ CategoryInfo : InvalidOperation: (:) [Invoke-Sqlcmd]、SqlPowerShellSqlExecutionException
+ FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand
$Resultは成功時も失敗時もnullが格納されており、
$_.Exceptionもnullでした。
Invoke-Sqlcmdのオプションに不備があるのでしょうか...
ご教授をお願いできればと思います。
何卒よろしくお願い致します。
以下の形にて修正
$Error.Clear()
$DBSERVER = "aaaa"
$DB = "bbbb"
$ID = "xxxx"
$PASSWORD = "yyyy"
$SQLFILE = "C:xxx\yyy\zzz.sql"
[hashtable]$sqlCmdParam = @{
ServerInstance = $DBSERVER
Database = $DB
Username = $ID
Password = $PASSWORD
InputFile = $SQLFILE
Verbose = $true
OutputSqlErrors = $true
}
Invoke-Sqlcmd @sqlCmdParam | Export-Csv $TSV -NoTypeInformation -Encoding Unicode -Delimiter "`t"
if($Error[0] -ne $null) {
#Error[0]をログに書き込む
}
きっとExport-Csvもスプラッティングで省略できるでしょう、、、時間が出来たら挑戦。
関連記事の回答者を含め、
この場を借りて、回答者の皆様へ御礼申し上げます。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+3
PowerShell側で検知したエラーは$Error
自動変数に格納されていきます。
$Error
自体はSystem.Collections.ArrayList
であり、直近のエラーは$Error[0]
で参照できます。
また、詳しく調べていないですが、Invoke-Sqlcmd
が共通パラメータをサポートしていれば、-ErrorAction Stop
などを付与することで、catch節でエラーを取得することもできます。
# エラー保管用変数
[System.Management.Automation.ErrorRecord]$errorRecord = $null
try {
# 失敗するコマンドレット
Get-Process -Name 存在しないプロセス名 -ErrorAction Stop
# -ErrorAction Stopを外すとエラーがキャッチされず、次の行が実行される
Write-Host 'エラーが起きた後'
} catch {
$errorRecord = $_
}
# エラー情報確認
$errorRecord
こちらは完全に好みの話になりますが、コマンドレットのパラメータが多い場合はスプラッティングを利用するのも手かもしれません。
$DBSERVER = "aaaa"
$DB = "bbbb"
$ID = "xxxx"
$PASSWORD = "yyyy"
$SQLFILE = "C:xxx\yyy\zzz.sql"
[hashtable]$sqlCmdParam = @{
ServerInstance = $DBSERVER
Database = $DB
Username = $ID
Password = $PASSWORD
InputFile = $SQLFILE
Verbose = $true
OutputSqlErrors = $true
}
$Result = Invoke-Sqlcmd @sqlCmdParam
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
試していませんが、-OutputSqlErrors を true にすると標準出力にエラーメッセージが入るのではないかと思います。
できなければ $result = Invoke-Sqlcmd 2>&1
として、エラー出力を標準出力にリダイレクトしてみてください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
以下参考
【Powershell】SQL Server テーブルデータのエクスポート
諸々とやってくれていますので、不足があればカスタマイズで何とかなるんじゃないかと。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.37%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2019/02/25 11:48
$Error関数使用にて実装可能でした。
コメント返信後、質問ページにて修正した際のコードを記載させていただきます。
また、スプラッティングのご教授ありがとうございます!
配列で渡せるのですね。しかもオプション指定の先頭ハイフンは省略できると、、
既存コードを一通り見直させていただきます!