Como @meuh mencionou nos comentários, sqlcmd estava lendo stdin , por isso, anexar </dev/null corrigiu o problema. O problema era que o loop while estava iterando sobre o stdin (anteriormente redirecionado de um arquivo exec 0<"${file}" ) e o sqlcmd que estava dentro do while tentou ler do > stdin . A solução estava fazendo o sqlcmd ler a partir de /dev/null em vez de stdin .
Corrigir
exec 3<&0
exec 0<"${file}"
while read -r line || [[ -n ${line} ]]
do
echo "${line}"
sqlcmd -S svr -U usr -P pwd -i input_file </dev/null
done
exec 0<&3
exec 3<&-
echo "Script completed successfully!"