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

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

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

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

2回答

18212閲覧

sqlcmdの戻り値の確認方法

imaiw

総合スコア1

SQL Server

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

0クリップ

投稿2021/12/22 08:33

バッチファイルを作っています。
sqlcmdの正常なら0、エラーなら1などの戻り値をもとに条件分岐をしたいのですが、戻り値を確認する方法がわかりません。
sqlcmdの下にecho errorlevelと書いたら「それだとこのsqlcmdの戻り値かどうかわからない」と言われました。

@echo off REM ##################### REM ★接続情報 REM ##################### REM サーバー名(サーバーのPC名\インスタンス名) SET dbServer= REM データベース名 SET dbName= REM ユーザー名 SET userName= REM パスワード SET password= REM 実行するSQLコマンドファイル(フルパスで指定し、拡張子は.sql) SET sqlCmdFilePath= REM 実行するSQLコマンド SET sqlcmd=sqlcmd -S %dbServer% -d %dbName% -U %userName% -P %password% -i %sqlCmdFilePath% REM ##################### REM SQL Server認証の場合 REM ##################### SET /P ANSWER="実行します。よろしいですか? (Y/N)" IF /i %ANSWER%==y ( echo 処理を開始します。 REM ★SQLファイルを実行 sqlcmd -S %dbServer% -d %dbName% -U %userName% -P %password% -i %sqlCmdFilePath% ) ELSE ( echo 処理をせずに終了します。 ) pause

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

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

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

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

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

maisumakun

2021/12/22 08:36

> sqlcmdの下にecho errorlevelと書いたら「それだとこのsqlcmdの戻り値かどうかわからない」と言われました。 それが唯一の正しい手段だと思うのですが。
guest

回答2

0

分岐には、直後にif errorlevelを使います。

CMD

1IF /i %ANSWER%==y ( 2 echo 処理を開始します。 3 REM ★SQLファイルを実行 4 sqlcmd -S %dbServer% -d %dbName% -U %userName% -P %password% -i %sqlCmdFilePath% 5 if errorlevel 1 ( 6 echo 戻り値が1以上だった 7 ) else ( 8 echo 戻り値が1未満0だった 9 ) 10) ELSE ( 11 echo 処理をせずに終了します。 12)

指定した数値と等しいときじゃなくて、以上の時なので、間違えないようにしましょう。

echo errorlevelだと、戻り値は関係なくて単にerrorlevelという文字列が表示されます。

投稿2021/12/22 14:51

otn

総合スコア84830

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

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

0

ベストアンサー

sqlcmdの下にecho errorlevelと書いたら「それだとこのsqlcmdの戻り値かどうかわからない」と言われました。

もしかして、指摘された方の意図としては sqlcmd コマンドに -b オプションを付けないと、SQL エラーが拾えない、ということを言っているのではないでしょうか?
例えば、SQL の構文エラーがあったとしても -b を付けない場合 sqlcmd コマンド自体は正常「0」を返します。

■ sqlcmd ユーティリティ
https://docs.microsoft.com/ja-jp/sql/tools/sqlcmd-utility

エラー報告のオプション

-b
エラーが発生したときに、 sqlcmd を終了し、DOS ERRORLEVEL 値を返します。 SQL Server のエラー メッセージの重大度が 10 よりも高い場合、DOS ERRORLEVEL 変数に返される値は 1 です。それ以外の場合は、0 が返されます。

投稿2021/12/22 14:38

cx20

総合スコア4633

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

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

imaiw

2021/12/23 02:33

ありがとうございます。勉強になります。 ちなみにsqlcmdを変数に入れて、その変数を使って条件分岐するやり方はできますか?調べてもerrorlevelしか出てきませんでした。
cx20

2021/12/23 02:58

> sqlcmdを変数に入れて どういう意味でしょうか? > 調べてもerrorlevelしか出てきませんでした はい。戻り値の判定は errorlevel を使います。 sqlcmd.exe の実行結果は errorlevel変数に返却されます。 otn さんの回答にある書き方か、比較演算子を用いるのであれば、以下のような書き方になりなります。 --------------------------  if %errorlevel% geq 1 (   echo 戻り値が1以上だった  ) else (   echo 戻り値が1未満0だった  ) -------------------------- ※ 読みやすさの為、全角スペースでインデントを入れています。 <参考> ■ SQLCMDコマンドの実行結果をログファイルに出力しよう / どうやってSQLCMDコマンドのエラーを検知するの? https://qiita.com/erik_t/items/9f4a123dfa2ecb3e1129
otn

2021/12/23 04:34

> 比較演算子を用いるのであれば、以下のような書き方になりなります。 括弧の中ではお書きの書き方では駄目なので、触れませんでした。 (遅延環境変数含め丁寧に説明すれば良いのですが)
cx20

2021/12/23 06:26

> 括弧の中ではお書きの書き方では駄目なので、触れませんでした。 > (遅延環境変数含め丁寧に説明すれば良いのですが) otn さん、ご指摘ありがとうございます。 括弧の中の処理であったことを失念していました。括弧の中だと以下のような対応が必要ですね。 <丸括弧の中で errorlevel 環境変数を使う場合> ・先頭に「@setlocal enabledelayedexpansion」を追加 ・以下に変更  変更前)%errorlevel%  変更後)!errorlevel! <参考> ■ バッチファイル界の魔境『遅延環境変数』に挑む(おまけもあるよ) https://qiita.com/plcherrim/items/c7c477cacf8c97792e17
imaiw

2021/12/23 08:27

ありがとうございます。別で質問しようとしていたことが解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問