none
Windowsバッチでのsql結果による条件分岐について RRS feed

  • 質問


  • Windowsバッチで、以下のようにコマンドラインでsqlファイルを実行し、
    その結果によって、Windowsバッチ内で条件分岐させたいです。

    SQLCMD -S MSSQL_XYZ -U sa -P adm!xyz@123 -i sample.sql

    sqlの結果が0の場合は次の処理へ
    sqlの結果が1の場合は終了

    どのようにバッチを書くのが良いでしょうか?

    尚、sqlの結果は必ず、0or1です。

    環境はWindows2003 Server、SQL Server 2008R2です。
    よろしくお願いいたします。

     

    2012年1月16日 6:33

回答

  • 「sqlの結果」とはなんですか? sample.sqlの実行結果ですか? それともSQLCMDの実行結果ですか? 「Windowsのバッチ」とはなんですか? 拡張子.BATのバッチファイルのことですか?
    sample.sqlの実行結果を.BATの世界に持ち込みたい、のように受け取れますが…あってるのかな。であればsqlcmd ユーティリティに書かれていますが

    :EXIT(SQL文)

    を使うと値を返せます。

    これでSQLCMDの実行結果として値が参照できますので、あとは.BATの世界の話になります。ここからはSQL Serverとは無関係ですがまぁERRORLEVELでも見ればいいかな。

    • 回答の候補に設定 佐祐理 2012年1月16日 10:00
    • 回答としてマーク 山本春海 2012年1月23日 2:30
    2012年1月16日 6:45
  • 佐祐理 さんが回答されている通り、単に%が要らないだけなのでは……
    【テスト1】
    @ECHO OFF
    SQLCMD -E -Q "EXIT(SELECT 0)"
    ECHO %ERRORLEVEL%
    IF ERRORLEVEL 1 GOTO OK
    ECHO FALSE
    GOTO END
    :OK
    ECHO OK
    :END
    
    

    実行結果
    -----------
              0
    
    (1 行処理されました)
    0
    FALSE
    【テスト2】
    @ECHO OFF
    SQLCMD -E -Q "EXIT(SELECT 1)"
    ECHO %ERRORLEVEL%
    IF ERRORLEVEL 1 GOTO OK
    ECHO FALSE
    GOTO END
    :OK
    ECHO OK
    :END
    
    

    -----------
              1
    
    (1 行処理されました)
    1
    OK

    【ご参考】
    「コマンドプロンプトを使ってみよう! -バッチファイル-」
    http://ykr414.com/dos/dos05.html#04
    • 回答としてマーク 山本春海 2012年1月23日 2:30
    2012年1月16日 9:43

すべての返信

  • 「sqlの結果」とはなんですか? sample.sqlの実行結果ですか? それともSQLCMDの実行結果ですか? 「Windowsのバッチ」とはなんですか? 拡張子.BATのバッチファイルのことですか?
    sample.sqlの実行結果を.BATの世界に持ち込みたい、のように受け取れますが…あってるのかな。であればsqlcmd ユーティリティに書かれていますが

    :EXIT(SQL文)

    を使うと値を返せます。

    これでSQLCMDの実行結果として値が参照できますので、あとは.BATの世界の話になります。ここからはSQL Serverとは無関係ですがまぁERRORLEVELでも見ればいいかな。

    • 回答の候補に設定 佐祐理 2012年1月16日 10:00
    • 回答としてマーク 山本春海 2012年1月23日 2:30
    2012年1月16日 6:45
  • 回答ありがとうございます。質問の意図ですが、おっしゃられてるとおりsqlの結果を.batの世界に持ち込みたいという質問でした。(素人ですみません)

    実装について確認させてください。

    コマンドラインでの実行は不要で、以下のように記述すればOKでしょうか?

    :EXIT(select MAX(COLUMN_A) from MST_A
    where COLUMNB = 'X')

    IF %ERRORLEVEL% NEQ 1 GOTO ExitError

    2012年1月16日 7:08
  • すいません、自分で試してみました。

    sql実行結果が0以外の場合なので、上記返信で書いたコードは以下のように修正して実行しました。

    :EXIT(select MAX(COLUMN_A) from MST_A where COLUMNB = 'X')

    IF %ERRORLEVEL% NEQ 0 GOTO ExitError

    このようにやるとsql実行結果が0でも1でも%ERRORLEVEL%は0になるようです。

    (echo %ERRORLEVEL%で調べました) 

    %ERRORLEVEL%の書き方が誤っているのでしょうか?

     

    2012年1月16日 8:16
  • SQLCMD ...
    IF ERRORLEVEL 1 command

    で、直前に実行したコマンドの戻り値が1以上の時、commandを実行する、というのはMS-DOS時代から何十年と続いている構文です。

    2012年1月16日 8:28
  •  

    ありがとうございます。私の理解レベルが低く申し訳ありません。回答を参考に試しておりますが、何度やってもダメです。

    .batファイルには下記のように書いています。

    想定する動きはEXIT内のsql結果が0の場合は処理続行

    1の場合はエラーとして終了する。

    ですが、この場合sqlの結果が0でも1でも%ERRORLEVEL%は0になるようです。

    *select MAX(COLUMN_A) from MST_A where COLUMNB = 'X'の結果は0or1のみです。

    どこの書き方が間違っているのでしょうか?教えていただけますと大変助かります。

    ----

    :EXIT(select MAX(COLUMN_A) from MST_A where COLUMNB = 'X')

    IF %ERRORLEVEL%==1 GOTO ExitError

    次の処理へ続く

    ---

     

    2012年1月16日 8:54
  • 佐祐理 さんが回答されている通り、単に%が要らないだけなのでは……
    【テスト1】
    @ECHO OFF
    SQLCMD -E -Q "EXIT(SELECT 0)"
    ECHO %ERRORLEVEL%
    IF ERRORLEVEL 1 GOTO OK
    ECHO FALSE
    GOTO END
    :OK
    ECHO OK
    :END
    
    

    実行結果
    -----------
              0
    
    (1 行処理されました)
    0
    FALSE
    【テスト2】
    @ECHO OFF
    SQLCMD -E -Q "EXIT(SELECT 1)"
    ECHO %ERRORLEVEL%
    IF ERRORLEVEL 1 GOTO OK
    ECHO FALSE
    GOTO END
    :OK
    ECHO OK
    :END
    
    

    -----------
              1
    
    (1 行処理されました)
    1
    OK

    【ご参考】
    「コマンドプロンプトを使ってみよう! -バッチファイル-」
    http://ykr414.com/dos/dos05.html#04
    • 回答としてマーク 山本春海 2012年1月23日 2:30
    2012年1月16日 9:43
  • SQLCMDはどこに消えたのでしょうか? 私の提案した :EXIT() はsqlcmdに渡されるコマンド、sample.sql内に記述するものなんですが。

    # だから最初に「「Windowsのバッチ」とはなんですか?」と確認したのですが。.SQLファイルに関する質問なのか.BATファイルに関する質問なのかはっきりしてください。

    • 編集済み 佐祐理 2012年1月16日 10:00
    2012年1月16日 9:59
  • 皆さんありがとうございます。再度試してみて問題なく動作しました!

     佐祐理さんのおっしゃる通りSQLCMDが抜けていましたし、chukiさんがおっしゃるとおりERRORLEVELの%は不要でした。

    もう1点だけもしご存知でしたら教えてください。

    :EXIT()に記述するselect文を直接()内に記述するのではなく、

    sqlファイルとして別プログラムに切り出して、:EXIT()でそのsqlファイルを呼び出すことは可能でしょうか?

     

    2012年1月17日 1:49
  • 最初から一貫して.SQLファイル内に書く内容についてコメントしています。ahurogushiさんはご自身の質問内容を誤解していませんか?
    # .BATに書いたりSQLCMDの引数に与えたり、全部質問者さんの誤解です。 
    2012年1月17日 1:56
  • 私の理解が追い付いておらずすみません。

    chukiさんのコードを参考にさせていただいて、イメージさせてください。

    .BATのファイルに以下のコードを記述する際、

    "EXIT()"内のSELECT文を別プログラム(.SQL)に切り出して書くことは可能でしょうか?

    可能な場合、どのように記述すれば良いでしょうか?

    @ECHO OFF
    SQLCMD -E -Q "EXIT(SELECT 0)"
    ECHO %ERRORLEVEL%
    IF ERRORLEVEL 1 GOTO OK
    ECHO FALSE
    GOTO END
    :OK
    ECHO OK
    :END

    2012年1月17日 2:33

  • (?_?) 佐祐理さんの回答はご確認されていますでしょうか?

    SQLCMD -i hogehoge.sql

    とした場合、EXIT文を記述するのはあくまでhogehoge.sql内ですよ^^。

    hogehoge.sql内から抜ける部分の戻り値としてEXIT文を入れてください。

     【バッチファイル】

    @ECHO OFF
    SQLCMD -E -i hogehoge.sql
    ECHO %ERRORLEVEL%
    IF ERRORLEVEL 1 GOTO OK
    ECHO FALSE
    GOTO END
    :OK
    ECHO OK
    :END
    
    
    

    【hogehoge.sql】

    -- hogehoge.sql
    -- 単にEXITで結果だけ返す
    
    EXIT(select MAX(COLUMN_A) from MST_A where COLUMNB = 'X')
    

     


    • 編集済み ChukiMVP 2012年1月17日 2:49
    2012年1月17日 2:49
  • ありがとうございます。確認しているのですが、わからなかったので質問させていただきました。申し訳ありません。

    2012年1月17日 5:07