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!