質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

3回答

5748閲覧

【PowerShell】Invoke-Sqlコマンドのエラーメッセージ取得方法

reraNine

総合スコア124

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2019/02/20 06:47

編集2019/02/25 02:56

お世話になっております。

■関連記事
https://teratail.com/questions/175395

少々引用させていただきます。


現在PowerShellから
sqlファイルに定義されているSELECT文からTSVファイルを出力するpgを作成中です。

PowerShell

1$DBSERVER = "aaaa" 2$DB = "bbbb" 3$ID = "xxxx" 4$PASSWORD = "yyyy" 5$SQLFILE = "C:xxx\yyy\zzz.sql" 6$TSV = "C:aaa\bbb\ccc\ddd.tsv" 7$Result = Invoke-Sqlcmd ` 8-ServerInstance $DBSERVER ` 9-Database $DB ` 10-Username $ID ` 11-Password $PASSWORD ` 12-InputFile $SQLFILE ` 13-Verbose -OutputSqlErrors $true | Export-Csv $TSV -NoTypeInformation -Encoding Unicode -Delimiter "`t"

上記PGにてSQLからTSV出力が可能となりました。
ここで、試しにSQLファイルを修正し、存在しない列を参照する様変更して
実行した結果、コンソール上でエラーメッセージは表示されたのですが、
そのメッセージを保持したいです。

Exception

1Invoke-Sqlcmd : Invalid column name 'XXXXX'. 2発生場所 c:YYYYYYY.ps1:54 文字:8 3+ $Result = Invoke-Sqlcmd ... 4+ CategoryInfo : InvalidOperation: (:) [Invoke-Sqlcmd]、SqlPowerShellSqlExecutionException 5+ FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand

$Resultは成功時も失敗時もnullが格納されており、
$_.Exceptionもnullでした。
Invoke-Sqlcmdのオプションに不備があるのでしょうか...

ご教授をお願いできればと思います。
何卒よろしくお願い致します。


以下の形にて修正

Powershell

1$Error.Clear() 2 3$DBSERVER = "aaaa" 4$DB = "bbbb" 5$ID = "xxxx" 6$PASSWORD = "yyyy" 7$SQLFILE = "C:xxx\yyy\zzz.sql" 8 9[hashtable]$sqlCmdParam = @{ 10 ServerInstance = $DBSERVER 11 Database = $DB 12 Username = $ID 13 Password = $PASSWORD 14 InputFile = $SQLFILE 15 Verbose = $true 16 OutputSqlErrors = $true 17} 18Invoke-Sqlcmd @sqlCmdParam | Export-Csv $TSV -NoTypeInformation -Encoding Unicode -Delimiter "`t" 19if($Error[0] -ne $null) { 20 #Error[0]をログに書き込む 21}

きっとExport-Csvもスプラッティングで省略できるでしょう、、、時間が出来たら挑戦。

関連記事の回答者を含め、
この場を借りて、回答者の皆様へ御礼申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

PowerShell側で検知したエラーは$Error自動変数に格納されていきます。

$Error自体はSystem.Collections.ArrayListであり、直近のエラーは$Error[0]で参照できます。

自動変数

about_Automatic_Variables | Microsoft Docs

また、詳しく調べていないですが、Invoke-Sqlcmdが共通パラメータをサポートしていれば、-ErrorAction Stopなどを付与することで、catch節でエラーを取得することもできます。

powershell

1# エラー保管用変数 2[System.Management.Automation.ErrorRecord]$errorRecord = $null 3 4try { 5 # 失敗するコマンドレット 6 Get-Process -Name 存在しないプロセス名 -ErrorAction Stop 7 # -ErrorAction Stopを外すとエラーがキャッチされず、次の行が実行される 8 Write-Host 'エラーが起きた後' 9} catch { 10 $errorRecord = $_ 11} 12 13# エラー情報確認 14$errorRecord

こちらは完全に好みの話になりますが、コマンドレットのパラメータが多い場合はスプラッティングを利用するのも手かもしれません。

powershell

1$DBSERVER = "aaaa" 2$DB = "bbbb" 3$ID = "xxxx" 4$PASSWORD = "yyyy" 5$SQLFILE = "C:xxx\yyy\zzz.sql" 6 7[hashtable]$sqlCmdParam = @{ 8 ServerInstance = $DBSERVER 9 Database = $DB 10 Username = $ID 11 Password = $PASSWORD 12 InputFile = $SQLFILE 13 Verbose = $true 14 OutputSqlErrors = $true 15} 16 17$Result = Invoke-Sqlcmd @sqlCmdParam

投稿2019/02/20 09:47

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reraNine

2019/02/25 02:48

ご回答ありがとうございます。 $Error関数使用にて実装可能でした。 コメント返信後、質問ページにて修正した際のコードを記載させていただきます。 また、スプラッティングのご教授ありがとうございます! 配列で渡せるのですね。しかもオプション指定の先頭ハイフンは省略できると、、 既存コードを一通り見直させていただきます!
guest

0

以下参考
【Powershell】SQL Server テーブルデータのエクスポート
諸々とやってくれていますので、不足があればカスタマイズで何とかなるんじゃないかと。

投稿2019/02/20 09:23

sazi

総合スコア25188

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reraNine

2019/02/25 03:01

ご回答ありがとうございます。 SQLCMDをInvoke-SQLCMDに移行した際、丁度ご添付いただきましたURLを参照させていただいておりました。
guest

0

Invoke-Sqlcmd

試していませんが、-OutputSqlErrors を true にすると標準出力にエラーメッセージが入るのではないかと思います。

できなければ $result = Invoke-Sqlcmd 2>&1 として、エラー出力を標準出力にリダイレクトしてみてください。

投稿2019/02/20 08:12

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reraNine

2019/02/25 02:59

ご回答ありがとうございます。 どちらも実施してみましたが、メッセージが格納されませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問