O analisador de lote usa o seguinte para delimitar os parâmetros: <space>
<tab>
;
,
=
<0xFF>
Esse último caractere é um espaço sem quebra.
É impossível escapar dos delimitadores de parâmetro na linha de comando. A única maneira de incluir um delimitador em um valor de parâmetro é colocar o parâmetro inteiro entre aspas duplas.
Você pode chamar seu script usando: yourScript.bat "select * from sometable where c3 < 999999999"
. Como o <
agora é citado, você não precisa se preocupar em escapar dele.
As cotações são consideradas parte do valor. Seu uso do modificador ~
em %~2
removerá as aspas do valor do parâmetro. Mas agora você precisa se preocupar em reciclar ou então escapar do <
. A coisa mais simples a fazer é adicionar aspas em toda a expressão de atribuição: set "vSQL=%~2"
. Quando feito dessa maneira, as aspas protegem o <
, mas elas não são incluídas no valor.
Quando chega a hora de usar a variável, você precisa se preocupar novamente com o caractere <
. Nesse caso, é mais simples ativar e usar a expansão atrasada.
setlocal enableDelayedExpansion
echo !vSQL!