SQLCMDをバッチ内で記述した時に結果が変わってしまう事象に遭遇した
sqlcmd.exeを使った時にたまたまハマっただけで、原因はバッチファイルでの%の扱い方の問題だった 現象
code:sqlcmd.bat
@echo off
SQLCMD.EXE -S host -Q "SELECT 'OK' WHERE 'abc' like 'a%';"
pause
-Qオプションにはクエリを渡せる
'abc' like 'a%'は真なので、実行の結果OKが出力されると想定していたのだが…
code:期待する結果
--
OK
(1 行処理されました)
OKが出力されなかった(whereの結果が偽だった)
code:実際の結果
--
(0 行処理されました)
なぜ?
他の環境での実行結果
以下のような環境で試してみた結果、これだと想定通りOKが出力されることがわかった
1. SSMSで新規SQLファイルを作成し、上記select文を貼り付け実行
2. コマンドプロンプトを起動しSQL Serverに接続、上記select文を貼り付け実行
3. また、バッチファイルで実行しても正しく取得される場合もある?
原因
「@echo offとpauseしかバッチ的な記述してないけど、もうおかしいところがわからない。一応削ってみて結果が変わるか?」くらいの感覚なので偶然 code:sqlcmd.bat
SQLCMD.EXE -S host -Q "SELECT 'OK' WHERE 'abc' like 'a%';"
pause
@echo offがないので、プロンプトでは以下のようにコマンドが出力された(likeに注目) code:実際の結果_echo_offなし
C:\Users\gosyujin\Desktop>SQLCMD.EXE -S host -Q "SELECT 'OK' WHERE 'abc' like 'a';"
--
(0 行処理されました)
続行するには何かキーを押してください . . .
パーセントがなくなってる
なので条件が'abc' like 'a'になってる
このlikeは偽なのはわかる
でもなんでパーセント消えてる?
バッチ パーセント LIKE ワイルドカード、あっ…!という感じで全然気づかなかった
code:検証.bat
SQLCMD.EXE -S host -Q "SELECT 'OK' WHERE 'abc' = 'abc';"
SQLCMD.EXE -S host -Q "SELECT 'OK' WHERE 'abc' like 'a%';"
SQLCMD.EXE -S host -Q "SELECT 'OK' WHERE 'abc' like 'a%%';"
pause
code:検証結果_echo_offなし
C:\Users\gosyujin\Desktop>SQLCMD.EXE -S host -Q "SELECT 'OK' WHERE 'abc' = 'abc';"
--
OK
(1 行処理されました)
C:\Users\gosyujin\Desktop>SQLCMD.EXE -S host -Q "SELECT 'OK' WHERE 'abc' like 'a';"
--
(0 行処理されました)
C:\Users\gosyujin\Desktop>SQLCMD.EXE -S host -Q "SELECT 'OK' WHERE 'abc' like 'a%';"
--
OK
(1 行処理されました)
これはハマる…
本当はバッチに埋め込まない方がいいんだろうな…